2012-02-29 3 views
2

Практически я не понимаю использование блока sBIT в PNG-файле.Какова цель блока sBIT в PNG-файле?

Я хранение PNG файлов из 11 бит/канал источника RGB, поэтому я послушно установить кусок 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 */ 

Когда изображения просматриваются просмотрщик окон (родной Vista viewer/Paint.net), нижние 8 бит усекаются, поэтому я могу видеть только верхние 3 бита. Я бы подумал, что кусок sBIT будет автоматически инструктировать читателей, чтобы сдвинуть пиксели на 5 бит до MSB, чтобы оправдать данные для отображения. Кажется, не так.

Когда я открываю файлы PNG в моем коде, которые либо имеют или не имеют кусок SBIT, и сделать следующее:

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, возможно, это не так, как вы планировали. –

+0

@MichaelMadsen 16: Я IHDR с png_set_IHDR (img-> p, img-> i, width, height, 16, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); ' – Jamie

+0

@MichaelMadsen На основании ссылки, которую вы опубликовали, я 'm заставляло удивляться: есть ли кусок 'sBIT' только средство для предоставления маской? – Jamie

ответ

2

sBIT Chunk сообщает декодеру количество значимых бит в данных пикселя. По сути, он сообщает декодеру, что данные уже сдвинуты влево, чтобы соответствовать стандартной битовой глубине. Например. Для вашего случая с 11-разрядными данными вы должны были сдвинуть пиксели, оставшиеся на 5 бит, и сохранить их как 16 бит на пиксель. Декодер увидит, что из 16 бит в каждом цвете, только верхние 11 являются значительными, так что он может потенциально повторно сжать изображение в новом формате, зная, что из 16. Есть только 11 полезных бит из 16.

+0

Хорошо ... так как мне читать данные? 'Png_set_shift()' похоже на сдвиг слева, есть ли функция правого сдвига в API 'pnglib'? – Jamie

+1

Если у вас есть правильно сформированный PNG-файл, вы должны иметь возможность игнорировать блок sBIT и по-прежнему отображать изображение правильно, потому что бит уже сдвинут. Я написал свой собственный PNG-кодек, поэтому я ничего не знаю о pnglib. Дело в том, что данные пикселя должны быть правильно сформированы уже, а фрагмент sBIT - это всего лишь подсказка для декодера, если ему интересно узнать больше деталей. – BitBank

+0

При вызове png_set_shift() перед чтением файла libpng сдвинет данные вправо. Функция, которая делает это, - png_do_unshift() (К сожалению, это все, что позволяет мне преобразовывать 8-битные данные в 4-битную упаковку) –

Смежные вопросы