2013-04-16 1 views
5

Я пытаюсь разобраться с изображениями RGBA TIFF с 16 битами на канал с помощью языка C, я не смог найти много информации о 16-битных изображениях в спецификациях.Изображения TIFF: как пиксели изображения 16 бит-RGBA чересстрочны?

В случае 8-битного RGBA-изображения я понимаю, что пиксель хранится как uint32 и может быть деинтерлейсирован путем группировки 32 бит в 4 группы (R, G, B, A) из 8 биты. Тогда дело с 8 битами на канал RGBA изображений, я делаю следующее (см также прилагается исходный код here):

  1. хранить данные изображения в качестве вкладки uint32 (с помощью TIFFReadRGBAImageOriented), что я называю data_tiff
  2. I деинтерлейсинг пикселей, используя следующие команды: (uint8) TIFFGetR(*data_tiff), (uint8) TIFFGetG(*data_tiff), (uint8) TIFFGetB(*data_tiff) & (uint8) TIFFGetA(*data_tiff)

В случае 16 бит на канал RGBA изображения, не могли бы вы сказать мне, как могу ли я деинтерлейсировать пиксели? , если я мог бы извлечь данные изображения в качестве вкладки uint64, то я мог бы сделать следующее:

#define TIFF16GetR(abgr) ((abgr) & 0xffff) 
#define TIFF16GetG(abgr) (((abgr) >> 16) & 0xffff) 
#define TIFF16GetB(abgr) (((abgr) >> 32) & 0xffff) 
#define TIFF16GetA(abgr) (((abgr) >> 48) & 0xffff)` 
  1. Я прочитал данные изображения в качестве вкладки uint64
  2. Я DEINTERLACE пикселей с использованием (uint16) TIFF16GetR(*data_tiff), (uint16) TIFF16GetG(*data_tiff), (uint16) TIFF16GetB(*data_tiff) & (uint16) TIFF16GetA(*data_tiff)

но мне кажется, что данные изначально не сохраняются во вкладке uint64, так интересно, как переплетены 16 бит на канал изображения в УИН вкладка t32 пикселей.

Я также сталкиваются с трудностями дело с 16 битами изображения оттенками серого таким же образом (с помощью TIFFReadRGBAImageOriented, чтобы получить данные изображения и пытается преобразовать каждый пиксель в uint16)

В целом, у вас есть какой-либо кусок документации по 16-битным оттенкам серого и цветным изображениям?

Спасибо, С наилучшими пожеланиями,

Rémy А.

+1

Что вы подразумеваете под словом «tab», выше? Я не могу разобрать это ... Может быть, это «таблица», может быть? – unwind

+0

Я имею в виду указатель: uint32 * –

ответ

6

интерфейс TIFFReadRGBAImage высокого уровня всегда будет считывать изображение с точностью 8 бит на выборку.

Для того чтобы прочитать изображение на 16 бит на канал без потери точности, вы можете напрямую использовать TIFFReadScanline и прочитать правильный объем данных в соответствии с SamplesPerPixel и BitsPerSample. Но это будет работать только в том случае, если изображение хранится в полосах (а не в виде плиток, которые были введены в TIFF 6.0), и в каждой сжатой полосе должна быть только одна строка (если изображение сжато).

Если вы хотите обрабатывать все вид TIFF изображения с помощью TIFFReadRGBAImage заменяется без, то вы должны обнаружить формат изображения и использовать низкоуровневый интерфейс, такой как TIFFReadEncodedStrip и TIFFReadEncodedTile.

Обратите внимание, что спецификации TIFF очень обширны и гибки, и использование этих низкоуровневых интерфейсов для обработки любого возможного изображения не будет простой задачей, поэтому вам может быть лучше использовать библиотеку более высокого уровня, чем libtiff, если вы Можно.

EDIT

Что вы имеете в виду в комментарий является первой частью спецификации TIFF 6.0, известной как Baseline TIFF

«Когда TIFF была введена, ее расширяемость вызвала совместимость проблемы. Гибкость в кодировании привела к шуткам, что TIFF означает тысячи несовместимых форматов файлов. [9] Чтобы избежать этих проблем , каждый читатель TIFF должен был прочитать базовый TIFF. Исходный TIFF не включает слои или сжатие с помощью JPEG или LZW. Baseline TIFF формально известен как TIFF 6.0, часть 1: Базовый TIFF »от Wikipedia

A Baseline TIFF не поддерживает глубину немного выше, чем 8 бит, так вот почему в спецификации Baseline TIFF, то значение BitsPerSample для изображения в градациях серого может быть только 4 или 8, а для изображения RGB может быть только 8 бит на канал. Более высокая битовая глубина поддерживается как расширение базовой спецификации TIFF, и не требуется для считывателя TIFF для их поддержки.

Плиточных изображения также является расширение спецификации базовой линии, где StripOffsets, StripByteCounts и RowsPerStrip поля заменяется TileWidth, TileLength, TileOffsets и TileByteCounts, так что вы можете отличить плиточное изображение от раздели изображений, посмотрев на существующие месторождениях с использованием TIFFGetField().

+0

Спасибо за ваш ответ, я мог бы что-то прочитать, поскольку вы предлагаете где-то в Интернете, что также говорит о том, что основное ограничение интерфейса, ориентированного на сканирование, помимо необходимости сначала идентифицировать существующий файл как имеющий подходящую организацию, заключается в том, что случайный доступ к отдельным линиям сканирования может быть предоставлен только тогда, когда данные не хранятся в сжатом формате или когда количество строк в полосе данных изображения установлено равным одному (RowsPerStrip - одно). что означает, что такой способ работы с 16-битными изображениями не будет работать для любого 16-битного изображения, знаете ли вы другой способ сделать это? –

+0

Да, я отредактировал свой ответ, чтобы ограничить подход scanline явным. – zakinster

+0

ОК спасибо за этот очень полный ответ. Я был бы рад использовать библиотеку высокого уровня, но чем меньше я ввожу зависимости, тем лучше ... –

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

  • Нет связанных вопросов^_^