2009-07-09 3 views
4

Я пишу программу для преобразования некоторых данных, в основном кучу Tiff изображений. У некоторых из Tiffs есть небольшая проблема с ними. Они выглядят прекрасно в некоторых зрителях (Irfanview, старая система клиента), но не в других (новая система Клиента, просмотрщик изображений и просмотрщик окна). Я вручную посмотрел на двоичные данные, и все теги выглядят нормально. Может ли кто-нибудь порекомендовать приложение, которое может его проанализировать, и сказать мне, что, если что-нибудь, ошибается?Tiff Analyzer

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

UDPATE: Для тех, кто заинтересован, вот теги хорошего и плохого файла:

BAD
Tag Тип Длина Значение
256 Ширина изображения SHORT 1 1652
257 Изображение Длина SHORT 1 704
258 бит на выборку SHORT 1 1
259 Сжатие КОРОТКОГО 1 4
262 фотометрических КОРОТКИЙ 1 0
266 Наполните Заказать SHORT 1 1
273 Strip Смещения LONG 1 210 (d2 Hex)
274 ​​Ориентация SHORT 1 3
277 выборок на пиксель SHORT 1 1
278 строк на полосу SHORT 1 450
279 Strip Byte Counts LONG 1 7264 (1c60 Hex)
282 X Разрешение РАЦИОНАЛ 1 < 194> 200/1 = 200,000
283 Y Решение РАЦИОНАЛ 1 < 202> 200/1 = 200,000
284 Конфигурация планарная КОРОТКОЕ 1 1
296 измерения разрешенияSHORT 1 2

Хорошо
Tag Тип Длина Значение
254 New подфайла Тип LONG 1 0 (0 Hex)
256 Ширина изображения SHORT 1 1193
257 Изображение Длина SHORT 1 788
258 Bits Per Sample SHORT 1 1
259 Compression SHORT 1 4
262 Фотометрический SHORT 1 0
266 Наполните Заказать SHORT 1 1
270 изображение Описание ASCII 45 256
273 Strip Смещение LONG 1 1118 (45й H)
274 ​​Ориентация КОРОТКОЙ 1 1
277 выборок на пиксель SHORT 1 1
278 строк на полоску длина 1 788 (314 Hex)
279 Газа Байт Считает LONG 1 496 (1f0 Hex)
280 мин Пример значения КОРОТКОЕ 1 0
281 Макс Пример значения КОРОТКОЕ 1 1
282 X Разрешение РАЦИОНАЛ 1 < 301> 200/1 = 200,000
283 Y Решение РАЦИОНАЛ 1 < 309> 200/1 = 200.000
284 SHORT Конфигурация Planar 1 1
293 Группа 4 Опции LONG 1 0 (0 Hex)
296 Разрешение блока SHORT 1 2

ответ

0

Стоит дать ImageMagick идти. Я понимаю, что TIFF является довольно сложным файловым форматом и что не все полностью реализуют формат.

1

LibTIFF может быть полезно. Проблемы с просмотром Tiff часто возникают из-за используемого сжатия. Я бы посмотрел на это.

3

Обычно это связано с тем, что tiff использует кодировку JPEG из стандарта 6.0, которая была вскоре оставлена. Посмотрите на тег 259. Если это 6, это проблема. JPEG-файлы должны быть закодированы с помощью «более новой» схемы, 7. Стандартные библиотеки не будут читать старые, в том числе те, которые поставляются с Windows.

Вы можете использовать libtiff (или любую из библиотек или программ, которые используют libtiff, большинство из них), чтобы прочитать их, но схема 6 (OJPEG) намеренно отключена по умолчанию в libtiff. Вам нужно будет исправить и перекомпилировать libtiff, чтобы включить его. Here's a link with instructions.

+0

Тег 259 - 4 (добавление слов для удовлетворения требований минимальной длины комментариев ... sigh) – Kevin

+0

Является ли ширина изображения на проблемных, делящихся на 8? Предполагается, что это сжатие группы 4, но не все ... –

+0

Нет, это 1652. См. Обновление в главном вопросе – Kevin

0

TIFF - очень сложный формат - не только в насыщенности данных, которые он может кодировать (различные пиксельные форматы, различные кодировщики), но и из-за богатства самого формата файла (его общая структура, которая может содержать что-нибудь). Это, в основном, свалка мусора для каждой идеи, которую мы когда-либо имели при визуализации. :-)

Я бы очень рекомендовал библиотеку изображений WPF из .NET 3.0. Его декодер Tiff, хотя и не поддерживает все пиксельные форматы, он очень надежный и имеет простой интерфейс для доступа ко всем метаданным.

1

RowsPerStrip в плохом изображении составляет 450, что меньше 704, длина изображения (высота). Это означает, что изображение должно иметь две полосы. Из-за этого у StripOffsets и StripByteCounts должно быть количество из двух. Они указывают смещения файла, где расположены данные полосы. Когда эти смещения отсутствуют, только первая полоса будет декодируемой.