簡體   English   中英

將 16 位灰度映射到 PNG 中的 8 位

[英]Mapping 16 bit grayscale to 8 bit in PNG

我正在嘗試在 C# 中解碼一個灰度圖像,每通道 16 位 (bpc) 的 PNG。 我相信我正在解碼正確的原始值,但是當我轉換為 8bpc 以返回值時,我沒有計算與System.Drawing 、 Gimp 或SixLabors.ImageSharp相同的值。

給定單個灰度像素的以下字節值:

byte b0 = data[index];
byte b1 = data[index + 1];

我嘗試了以下映射:

byte result = b0;
byte result = (byte)(255 * (((b0 << 8) + b1)/ushort.MaxValue));
byte result = (byte)(((b0 << 8) + b1)/256.0);

但是這些方法似乎都與其他軟件為以下值預測的值不匹配:

b0   b1   expected
55   186  55
67   135  67
35   241  36

我確定我誤解了將正常化回 8 bpc 值的正確方法。

有問題的圖像是這樣的:

16 x 16 像素灰度圖像,16 bpc

這是轉換位深度的官方方法:

https://www.w3.org/TR/2003/REC-PNG-20031110/#13Sample-depth-rescaling

output = floor((input * MAXOUTSAMPLE / MAXINSAMPLE) + 0.5)

where

MAXINSAMPLE = (2^sampledepth)-1
MAXOUTSAMPLE = (2^desired_sampledepth)-1

因此,如果我以您的最后一個示例為例:

35 << 8 | 241 == 8960 | 241 == 9201
9201 * 255 / 65535 == 2346255 / 65535 == 35
floor(35 + 0.5) == 35

為什么不是36

可能涉及伽馬

結論:

首先檢查您的內部實施是否正確遵循規范,然后進行相應調整。

https://www.w3.org/TR/2003/REC-PNG-20031110/

暫無
暫無

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

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