2012-02-29 25 views
2

實際上,我不明白在PNG文件中使用sBIT塊。PNG文件中sBIT塊的用途是什麼?

我存儲從11位/通道RGB源PNG文件,所以我忠實地設置SBIT塊在我的(c)中的代碼:

... 
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 */ 

當圖像被觀看的觀察者視窗(天然Vista的圖片瀏覽器/ Paint.net),低8位被截斷,所以我只能看到高3位。我認爲sBIT塊會自動指示讀者左移像素5位,以MSB爲數據顯示。似乎並非如此。

當我打開我的代碼,具有或不具有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,以驗證像素數據是否適合查看,但請參閱「原始」數據以進行數值分析?

+0

IHDR塊中指定的位深度是多少? [sBIT不允許超過該值](http://www.w3.org/TR/PNG/#11sBIT);如果你沒有使用16位的深度,那可能是因爲它沒有按照你的意圖工作。 – 2012-02-29 17:49:00

+0

@MichaelMadsen 16:I ST的IHDR用'png_set_IHDR(img-> P,img-> I,寬度,高度,如圖16所示,PNG_COLOR_TYPE_RGB,PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);基於你貼的鏈接' – Jamie 2012-02-29 17:55:54

+0

@MichaelMadsen,我被迫想知道:'sBIT'塊只是一種提供掩碼的手段嗎? – Jamie 2012-02-29 17:57:50

回答

2

sBIT Chunk告訴解碼器像素數據中有效位的數量。實質上,它告訴解碼器數據已經被左移以適應標準位深度。例如。對於11位數據的情況,您應該將像素左移5位,並將其存儲爲每像素16位。解碼器將在每種顏色的16位中看到,只有前11位是有意義的,因此它可能以新格式重新壓縮圖像,因爲知道在16位中只有11個有用位。

+0

好的......那麼如何讀取數據? 'png_set_shift()'似乎左移,pnglib' API中是否有右移功能? – Jamie 2012-02-29 18:00:35

+1

如果你有一個正確的PNG文件,你應該可以忽略該sBIT塊並且仍然正確地顯示圖像,因爲這些位已經被移位了。我寫了自己的PNG編解碼器,所以我對pnglib一無所知。關鍵是像素數據需要被正確地形成,而sBIT塊只是解碼器的一個提示,如果它想知道更多的細節。 – BitBank 2012-02-29 18:09:57

+0

在讀取文件之前調用png_set_shift()時,libpng會右移數據。這樣做的功能是png_do_unshift() (不幸的是,它所做的只是阻止我將8位數據轉換爲4位打包) – 2013-05-08 19:20:39