1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public class GainmapProcessor {
/**
* 提取 Gainmap
*/
public Bitmap extractGainmap(Bitmap hdrBitmap) {
if (!hdrBitmap.hasGainmap()) {
return null;
}
Gainmap gainmap = hdrBitmap.getGainmap();
// 获取 Gainmap 的 Bitmap 数据
Bitmap gainmapBitmap = gainmap.getGainmapContents();
// 获取 Gainmap 元数据
Gainmap.Metadata metadata = gainmap.getMetadata();
float[] ratioMin = metadata.getRatioMin(); // [R, G, B]
float[] ratioMax = metadata.getRatioMax();
float[] gamma = metadata.getGamma();
Log.d("Gainmap", String.format(
"Size: %dx%d, RatioMin: [%.2f, %.2f, %.2f], RatioMax: [%.2f, %.2f, %.2f]",
gainmapBitmap.getWidth(), gainmapBitmap.getHeight(),
ratioMin[0], ratioMin[1], ratioMin[2],
ratioMax[0], ratioMax[1], ratioMax[2]
));
return gainmapBitmap;
}
/**
* 创建带 Gainmap 的图像
*/
public Bitmap createHdrBitmap(Bitmap sdrBase, Bitmap gainmapBitmap) {
// 创建 Gainmap 对象
Gainmap.Metadata metadata = new Gainmap.Metadata.Builder()
.setRatioMin(new float[]{1.0f, 1.0f, 1.0f})
.setRatioMax(new float[]{8.0f, 8.0f, 8.0f})
.setGamma(new float[]{1.0f, 1.0f, 1.0f})
.setEpsilonSdr(new float[]{0.0f, 0.0f, 0.0f})
.setEpsilonHdr(new float[]{0.0f, 0.0f, 0.0f})
.setDisplayRatioForFullHdr(1.0f)
.setMinDisplayRatioForHdrTransition(1.0f)
.build();
Gainmap gainmap = new Gainmap(gainmapBitmap, metadata);
// 将 Gainmap 附加到基础图像
Bitmap result = sdrBase.copy(Bitmap.Config.ARGB_8888, true);
result.setGainmap(gainmap);
return result;
}
}
|