実際には、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で正当化できますが、数値解析のために「元の」データを参照できますか?