5

実際には、PNGファイルでのsBITチャンクの使用法を理解していません。

11ビット/チャンネルのRGBソースからPNGファイルを保存しているので、(c)コードでsBITチャンクを忠実に設定します。

...
png_color_8 sig_bit;

sig_bit.gray = 0;
sig_bit.alpha = 0;
sig_bit.red = 11;
sig_bit.green = 11;
sig_bit.blue = 11;

png_set_sBIT(png_ptr, info_ptr, &sig_bit);
...
/* save the png */

画像をWindowsビューア(ネイティブVista画像ビューア/Paint.net)で表示すると、下位8ビットが切り捨てられるため、上位3ビットしか表示されません。sBITチャンクは、表示するデータをMSBで正当化するために、ピクセルを5ビット左シフトするようにリーダーに自動的に指示すると思いました。そうではないようです。

コード内でsBITチャンクがある場合とない場合のpngファイルを開き、次の手順を実行します。

png_color_8p sig_bit;
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) {
    png_get_sBIT(png_ptr, info_ptr, &sig_bit);
    png_set_shift(png_ptr, sig_bit);
}

ピクセルデータは同じです。

sBITチャンクの使用モデルは何ですか?どういうわけかsBITチャンクを使用してピクセルデータを表示用にMSBで正当化できますが、数値解析のために「元の」データを参照できますか?

4

2 に答える 2

5

sBITチャンクは、ピクセルデータの有効ビット数をデコーダーに通知します。本質的には、データが標準のビット深度に収まるようにすでに左にシフトされていることをデコーダーに通知します。たとえば、11ビットデータの場合、ピクセルを5ビット左にシフトし、ピクセルあたり16ビットとして保存する必要があります。デコーダーは、各色の16ビットのうち、上位11ビットのみが重要であると認識します。そのため、16ビットのうち有用なビットが11ビットしかないことを認識して、新しい形式で画像を再圧縮できる可能性があります。

于 2012-02-29T17:57:45.363 に答える
0

ソースのビット深度は11で、そこから16ビット深度のPNG画像を作成しています。したがって、最上位ビットから最下位ビットまでのビットを次のように設定する必要があります。MSBLSB 2 ここで11はソースからのものです。XXXX XXXX XXX0 0000X

「<ahref="http://www.libpng.org/pub/png/spec/1.1/PNG-Chunks.html#C.sBIT"rel="nofollownoreferrer">デコーダーはsBITチャンクに注意を払う必要はありません」を使用して 、作成されたイメージを表示します。ビット深度11のXXX XXXX XXXX2とビット深度16の2は同じ値ですXXXX XXXX XXX0 0000

ソースビットを抽出するには、ビットを(16-11 sBIT)だけ右シフトします。注:画像データを読み取る前にを使用すると、 libpngが自動的に機能します。または旗を使ってください。さて、質問に答えるために:それが目的です。png_set_shift() sBITpng_read_png()PNG_TRANSFORM_SHIFT

于 2021-01-02T12:58:00.760 に答える