Написание 10,12-битных файлов TIFF с помощью LibTIFF C ++ - PullRequest
11 голосов
/ 15 августа 2011

Я пытаюсь записать 10,12-битные файлы RGB TIFF с помощью LibTIFF.

Пиксельные данные сохраняются локально в буфере unsigned short (16 бит)

1) Если яустановите TIFFTAG_BITSPERSAMPLE в 10 или 12, из буфера считывается недостаточно битов, и вывод неправильный.(Я понимаю, что это просто чтение 10 или 12 бит на компонент, а не 16, и это проблема)

2) Я попытался упаковать биты в буфер, так что это действительно 12-R,12-Г, 12-Б.В этом случае я думаю, что файл записывается правильно, но ни один из средств просмотра, которые я не смог найти, не смог бы правильно отобразить это изображение.

3) Если я установлю TIFFTAG_BITSPERSAMPLE на 16, зрители смогут отобразить изображение TIFF, но затемУ меня проблема в том, что я не знаю, было ли изначально изображение размером 10 или 12 бит (если я захочу позже прочитать его с помощью LibTIFF).Кроме того, зритель ожидает, что динамический диапазон будет 16 бит, а не 10 или 12, что также приведет к плохому представлению.

4) Самая досадная часть в том, что я не смог найти один 10, 12 или14-битное изображение TIFF в Интернете, чтобы увидеть, как должен выглядеть заголовок.

Итак, наконец, как правильно записать 10 или 12-битные данные изображения в файл TIFF ?????

1 Ответ

9 голосов
/ 15 августа 2011

В спецификации TIFF не указан способ сохранения 10, 12 или 14 бит на канал в изображении.В зависимости от кодера и декодера, возможно, все еще возможно работать с такими изображениями, но это фактически деталь реализации, поскольку они не обязаны делать это.

Если вам нужна точность более 8 битв TIFF ваш единственный выбор - 16 (или с плавающей запятой, но это совсем другая история).

Я не знаю ни одного формата изображения с конкретной поддержкой этих битовых глубин, поэтому зрители, вероятно, будут проблемойв любом случае, если вы должны хранить изображение с этой конкретной разрядностью.Самый простой обходной путь, который я могу придумать, состоит в том, чтобы просто сохранить как 16 бит на пиксель и поместить исходную битовую глубину в качестве метаданных (например, в теге ImageDescription), но все это зависит от того, для каких изображений будут использоваться и зачем вам эта информация.

...