Генерация и сжатие графика TIFF: R, GIMP, IrfanView, размеры файлов Photoshop.

Например, я создал несколько графиков качества публикации с высоким разрешением.

library(plot3D)
Volcano<-volcano
zf=10 #zoom factor
tiff("Volcano.tif", width=1800*zf, height=900*zf, res=175*zf, compression="lzw")
image2D(z = Volcano, clab = "height, m",colkey = list(dist = -0.20, shift = 0.15,side = 3, length = 0.5, width = 0.5,cex.clab = 1.2, col.clab = "white", line.clab = 2,col.axis = "white", col.ticks = "white", cex.axis = 0.8))
dev.off()

файл 22 мб.

Теперь я открываю файл в GIMP и не делая ничего больше, экспортирую его как "Volcano gimp.tif" (не меняя разрешение и не делая ничего другого). GIMP создает файл ("Volcano gimp.tif") размером 1,9 МБ.

imagemagick сообщает похожую статистику изображений:

$ identify Volcano.tif
Volcano.tif TIFF 18000x9000 18000x9000+0+0 8-bit DirectClass 22.37MB 0.000u 0:00.000
$ identify "Volcano gimp.tif"
Volcano gimp.tif TIFF 18000x9000 18000x9000+0+0 8-bit DirectClass 1.89MB 0.000u 0:00.000

даже при использовании identify -verbose два файла кажутся похожими.

В чем разница между этими файлами? Почему у них такие разные размеры файлов?

ОБНОВЛЕНИЕ: все становится еще безумнее. Я сделал то же самое с IrfanView, и я получаю разные размеры файлов. Исходный файл — это Volcano.tif, сгенерированный из R с compression="lzw". Посмотрите, как Volcano irfan.tif и Volcano gimp.tif различаются по размеру, но все остальные характеристики одинаковы. Объем памяти, DPI, цвета, разрешение идентичны. Размер диска разный.

введите здесь описание изображения

ОБНОВЛЕНИЕ 2: Adobe Photoshop уменьшает размер файла до 2,6 МБ.

введите здесь описание изображения

WinRar сообщает, что исходный TIFF, сгенерированный R, легко сжимается (от 22 МБ до 3,6 МБ).

ОБНОВЛЕНИЕ 3: эта проблема может быть похожа на Монтаж/объединение 2 изображений TIFF в плитку размером 2 столбца x 1 ряд без потери качества

ОБНОВЛЕНИЕ 4. Сгенерированный R файл TIFF можно найти здесь http://ge.tt/7ZvRd4C1/v/0?c


person ECII    schedule 02.01.2014    source источник
comment
Кажется, что-то не так с функцией tiff. На моем компьютере с Win7 (немного устаревшая версия 2.15.2) R вообще не создает действительный файл изображения, используя сжатие rle, jpeg или zip. Позже проверю на другой машине. А пока попробуйте поиграться с tiff вариантами и посмотрите, сможете ли вы воспроизвести мое странное поведение. Здесь может быть зарыта ошибка.   -  person Richie Cotton    schedule 02.01.2014
comment
compression="zip" разрушает мою сессию!   -  person ECII    schedule 02.01.2014
comment
Использование LZW с опцией предиктора и без нее для 24-битных данных может иметь огромное значение в коэффициенте сжатия (как вы наблюдаете). Разместите TIFF где-нибудь, я могу скачать их, и я скажу вам, почему они разных размеров.   -  person BitBank    schedule 02.01.2014
comment
Вот сгенерированный R файл TIFF ge.tt/7ZvRd4C1/v/0?c   -  person ECII    schedule 02.01.2014
comment
Сгенерированный R файл TIFF не использует предиктор TIFF. Это вызывает ужасное сжатие при работе с 24-битными данными, поскольку сжатие LZW работает с 8-битными данными за раз. Предсказатель позволяет секциям с постоянным цветом компенсировать друг друга, становиться черными и намного лучше сжиматься.   -  person BitBank    schedule 02.01.2014
comment
Хорошо, спасибо за информацию. Что это означает практически? Проблема только в компрессии? Должен ли я выводить как несжатый, а затем сжимать с помощью GIMP? Также, пожалуйста, сделайте это ответом, а не комментарием (было бы полезно включить некоторые дополнительные подробности, я рассматриваю возможность подачи этого как ошибка).   -  person ECII    schedule 02.01.2014
comment
В будущем вы можете использовать мой TIFFTOOL, чтобы увидеть все детали того, почему эти файлы отличаются: bitbanksoftware.com/tinytools .html   -  person BitBank    schedule 03.01.2014
comment
Я только что опубликовал версию своего TIFFTOOL для OSX для тех из вас, кто не использует Windows: itunes.apple.com/us/app/tifftool/id955437526?mt=12   -  person BitBank    schedule 05.02.2015
comment
Проблема, кажется, решена при использовании сжатие=lzw+p   -  person ECII    schedule 07.08.2018


Ответы (1)


По-видимому, компрессор TIFF LZW, используемый R, не использует важную опцию (предиктор TIFF), которая приводит к чрезвычайно большому файлу. Сжатие данных работает лучше всего, когда оно может распознавать симметрию/избыточность данных. В этом случае данные изображения состоят из 24-битных (3-байтовых) пикселей, содержащих красный, зеленый и синий 8-битные значения. Стандартное сжатие LZW ищет в потоке байтов повторяющиеся шаблоны. Если он смотрит на цветное изображение просто как на поток байтов, он увидит повторяющиеся шаблоны из 3 байтов вместо повторяющихся шаблонов постоянного цвета. Включение предиктора TIFF для данных приводит к тому, что разностный фильтр сохраняет дельту каждого пикселя с его соседом. Если соседние пиксели одного цвета, он будет хранить 0. Длинная строка нулей сжимается намного лучше, чем повторяющиеся шаблоны ненулевых символов длиной не менее 3 байтов.

Вот пример того, как это работает на линии в 6 пикселей. При кодировании предиктор начинается с правого края и работает слева для каждой строки развертки:

Original data:
2A 50 40 2A 50 40 2A 50 40 2A 50 40 2A 50 40 2A 50 40 (6 pixels of the same color)

After horizontal differencing (TIFF predictor):
2A 50 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

The data is much more compressible after the predictor since long runs of the same value (0x00) are easier for LZW to compress.

Вывод: это следует зарегистрировать как ошибку против владельца кода сжатия R, поскольку использование LZW на полноцветных изображениях без предиктора дает плохие результаты. В то же время необходим обходной путь для более эффективного сжатия.

person BitBank    schedule 02.01.2014
comment
Отлично. Спасибо. Я сообщил об ошибке bugs.r-project.org/bugzilla/show_bug. cgi?id=15626 . Что мне делать тем временем? Должен ли я сохранять несжатые файлы TIFF и сжимать их с помощью GIMP или ImageMagick или сохранять графики в формате PNG, а затем преобразовывать их в TIFF? - person ECII; 02.01.2014
comment
PNG должен дать вам самый маленький файл, поскольку он использует как горизонтальную, так и вертикальную симметрию. Несжатые файлы TIFF будут занимать огромное количество места на диске, поэтому даже плохо сжатые файлы будут лучшим выбором. Выбор окончательного формата файла зависит от того, какое программное обеспечение будет их открывать. Все они используют сжатие без потерь, поэтому исходные данные сохраняются. - person BitBank; 02.01.2014
comment
Что происходит, когда я беру плохо сжатый TIFF, сгенерированный из R, открываю его и сохраняю в GIMP. Сжатие LZW работает правильно? Это без потерь? Кроме того, PNG-›TIFF без потерь? (Мой издатель требует TIFF) - person ECII; 02.01.2014
comment
PNG и TIFF LZW без потерь (с предиктором или без него). Все преобразования файлов, которые вы планируете использовать, приведут к одинаковому результату, поэтому единственная разница будет заключаться в размере файла. - person BitBank; 02.01.2014
comment
Спасибо за очень грамотный ответ! - person Ben Bolker; 03.01.2014