簡體   English   中英

如何在Android中顯示HDR圖片?

[英]How to display HDR picture in Android?

我正在做一個 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) 方法中,因為顏色必須是一個整數:

long color = (A & 0xffff) << 48 | (B & 0xffff) << 32 | (G & 0xffff) << 16 | (R & 0xffff);
image.setPixel(0,0,color); //Argument type error

.
我也嘗試過使用 Color( 它具有 HDR 兼容方法)、Paint 和 Canvas,但沒有 Bitmap 方法接受它們只設置一個像素。

謝謝你的幫助!

如果您需要打開一個 HDR 文件,例如 16 位 png,然后顯示它,您可以使用 ImageDecoder.setTargetColorSpace 創建格式為Bitmap.Config.RGBA_F16位圖, 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 個通道打包為 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM