Извлечь JPEG из файла TIFF - PullRequest
6 голосов
/ 05 января 2012

Фон У меня большой файл TIFF, сжатый в формате JPEG (новый, сжатие 7 в стандарте TIFF) и мозаичный. Что мне нужно сделать, это извлечь эти плитки в отдельные файлы .jpg. Я должен быть в состоянии сделать это без распаковки / повторного сжатия данных изображения, потому что это потребует слишком много вычислительных ресурсов, поэтому все библиотеки, о которых я знаю, исключены.

Я много знаю о структуре файлов TIFF, но почти ничего о структуре файлов JPEG. У меня есть код, написанный прямо сейчас, который считывает данные тега JPEGTable из заголовка TIFF в байтовый массив (это означает, что он переходит к смещению, указанному тегом, и читает его там) И еще один фрагмент кода, который считывает целевой Tile в байт. массив. Затем я записываю байтовый массив Table в новый файл, а затем записываю байтовый массив Tile в этот файл. Последние 2 байта массива Table , которые я записываю с 0xFF, 0xFF, и то же самое для первых 2 байтов массива Tile , потому что я обнаружил, что оба массива начинаются и заканчиваются на последовательности jpeg SOI и EOI соответственно, и если бы у меня их было больше 1, файлы не были бы открыты никакими графическими программами.

For i as Integer = 0 to TableArray.Count-3
    stream.WriteByte(TableArray(i))
Next
stream.WriteByte(255)
stream.WriteByte(255)
stream.WriteByte(255)
stream.WriteByte(255)
For i as Integer = 2 to TileArray.Count-1
    stream.WriteByte(TileArray(i))
Next
stream.Close()

Задача Вот где я сейчас нахожусь, проблема в том, что все мои извлеченные плитки окрашены в розовый цвет там, где он должен быть белым, почти как цветовой негатив. Это не сплошной розовый, я вижу очертания объектов, которые я знаю, на исходном изображении. У кого-нибудь есть идеи, как я мог бы решить это? Кроме того, я делаю это в VB.NET, но я не думаю, что язык действительно имеет значение в этом случае, так как кажется, что это скорее проблема концепции / алгоритма / структуры файла, которую я делаю неправильно.

Если кто-то захочет, чтобы я опубликовал часть кода, который я использую, я могу просто знать, какая часть. Extracted Original

РЕДАКТИРОВАТЬ: я нашел в Технических примечаниях TIFF Adobe Photoshop от 22 марта 2002 г. раздел, в котором говорится:

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

Не уверен, относится ли это к моей проблеме или нет.

1 Ответ

5 голосов
/ 11 марта 2012

Сложность файлов TIFF, создаваемых Photoshop, заключается в том, что они поддерживают запись цветового пространства RGB в сжатые данные JPEG.Если вы извлечете одну плитку из файла TIFF и запишите ее как независимое изображение JPEG, она не будет отображаться правильно, потому что декодеры предполагают, что цветовое пространство равно YCbCr.Существует решение, если приложение для просмотра использует маркер Adobe APP14.В этот маркер включен байт, который определяет преобразование (цветовое пространство).Если вы вставите эту последовательность байтов перед SOI, ваше изображение будет правильно отображаться на многих зрителях.

FF EE 00 0E 41 64 6F 62 65 00 64 80 00 00 00 00

Последнеебайт определяет преобразование;в этом случае 0 указывает цветовое пространство RGB.Подробнее об этом можно прочитать здесь:

Документ метаданных Oracle JPEG

...