gpt4 book ai didi

java - 如何在 Android 中显示 HDR 图片?

转载 作者:行者123 更新时间:2023-12-03 11:18:20 24 4
gpt4 key购买 nike

我正在做一个 android 应用程序来解压缩、解码和显示 HDR 图片。
这些 HDR 图片每个组件(A、R、G、B)使用 2 个字节,因此一个像素由 8 个字节的值表示,该值只能与 long 类型匹配。

我正在使用 android 的 Bitmap 来显示图片,因为它们有一个构造函数允许使用 Bitmap.Config.RGBA_F16 进行 HDR :

int width = 1;
int height = 1;
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.RGBA_F16);

不幸的是,我找不到任何方法来填充位图的像素。我使用推荐的公式,但它不能用于 Bitmap 的 setPixel(x,y,color) 方法,因为颜色必须是 int:
long color = (A & 0xffff) << 48 | (B & 0xffff) << 32 | (G & 0xffff) << 16 | (R & 0xffff);
image.setPixel(0,0,color); //Argument type error

.
我也尝试过使用 Color ( which has a HDR compatible method)、Paint 和 Canvas,但没有 Bitmap 方法接受它们来设置一个像素。

谢谢你的帮助!

最佳答案

如果需要打开 HDR 文件,例如 16 位 png,然后显示,可以使用 ImageDecoder.setTargetColorSpace 创建格式为 Bitmap.Config.RGBA_F16 的位图像这样:

File file = new File(...);
ImageDecoder.Source source = ImageDecoder.createSource(file);
Drawable drawable = ImageDecoder.decodeDrawable(source, (decoder, info, src) -> {
decoder.setTargetColorSpace(ColorSpace.Named.EXTENDED_SRGB);
});
如果您需要显示存储在内存中的 HDR 图像,您可以使用 Bitmap.copyPixelsFromBuffer , 因为这种方法允许在不转换颜色空间的情况下设置位图的像素 Bitmap.setPixel做。在这种情况下,您需要打包 Half 表示的 4 个 channel 。将每个像素的值转换为 long,然后将这些 long 值写入 Buffer 最后将像素从缓冲区复制到位图。
LongBuffer buffer = LongBuffer.allocate(width * height);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// fill pixels values as needed
float r = (float)y / height;
float g = (float)y / height;
float b = (float)y / height;
float a = 1f;
long rBits = Half.halfToShortBits(Half.toHalf(r));
long gBits = Half.halfToShortBits(Half.toHalf(g));
long bBits = Half.halfToShortBits(Half.toHalf(b));
long aBits = Half.halfToShortBits(Half.toHalf(a));
long color = aBits << 48 | bBits << 32 | gBits << 16 | rBits;
buffer.put(color);
}
}
buffer.rewind();

bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGBA_F16);
bitmap.copyPixelsFromBuffer(buffer);

关于java - 如何在 Android 中显示 HDR 图片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com