Использование Imagemagick для преобразования PDF-файлов с растрами приводит к белому фону за разделами, покрытыми растрами.

Я попытался использовать ImageMagick (v6.8.9-9 Q16) для преобразования PDF-файла, содержащего встроенный в него файл PNG, в файл PNG.

Фон исходного PNG был прозрачным. В PDF это тоже выглядит нормально. Но в PNG, полученном после преобразования, область, изначально занятая PNG в PDF имеет белый фон. Пожалуйста, смотрите ссылки для большей ясности.

Команда, которую я выполнил, выглядит следующим образом:

convert -colorspace sRGB dice.pdf converted_dice.png

Я также попытался установить переключатель -transparent white, но в конечном итоге он убрал белые цвета, которые действительно требовались в финальном изображении.

Есть ли дополнительные переключатели или параметры, которые нужно передать convert, чтобы избавиться только от этого белого фона?


person Jerry    schedule 06.11.2014    source источник
comment
Не существует такого понятия, как PDF, содержащий файл PNG. Когда изображение находится внутри PDF, это растровые данные (и существуют различные схемы сжатия для этих фрагментов растровых данных — одна из них совпадает с используемой в JPEG). Возможно, в прежней жизни это был файл PNG, но его больше нет. Невозможно обнаружить это только по данным PDF. Конечно, вы можете извлечь растровые данные и снова преобразовать их в PNG. Или в TIFF, GIF, JPEG,... Если бы вы не знали заранее о создании PDF, вы бы не знали о предыдущей жизненной форме содержащихся изображений...   -  person Kurt Pfeifle    schedule 15.11.2014


Ответы (2)


Курт уже объясняет все очень подробно. Итак, вот как собрать образ с помощью ImageMagick после его запуска через pdfimages -png

pdfimages -png my.pdf my

Это результаты в двух файлах

identify my-0*png
  my-000.png PNG 360x310 360x310+0+0 8-bit sRGB 256c 3.3KB 0.000u 0:00.000
  my-001.png PNG 360x310 360x310+0+0 8-bit sRGB 256c 9.44KB 0.000u 0:00.000

my-001.png — это изображение с меткой smask в pdfimages -list. Чтобы собрать образ обратно в исходную форму, используйте -compose CopyOpacity с командой ImageMagick composite

composite -compose CopyOpacity my-001.png my-000.png my-reassembled.png

См. также http://www.imagemagick.org/Usage/masking/#masks для получения дополнительной информации.

person uroesch    schedule 02.04.2017

Ваш подход к этой задаче не работает.

Используемая вами команда преобразует всю страницу PDF формата Letter (612 x 792 pt) в изображение PNG.

Однако исходный размер изображения, встроенного в страницу PDF (612 x 792 pt), составляет 800 x 600 пикселей. Это можно увидеть, запустив pdfimages -list:

pdfimages -list dice.pdf 
 page num  type width height color comp bpc  enc interp object ID x-ppi y-ppi  size ratio
 ----------------------------------------------------------------------------------------
    1   0 image   800   600   rgb     3   8  image   no     12  0    72    72  277K   20%
    1   1 smask   800   600  gray     1   8  image   no     12  0    72    72 50.1K   11%

Итак, это первая проблема при преобразовании страницы PDF: она не дает правильного размера содержащихся изображений.

Однако вторая, более фундаментальная проблема заключается в следующем: любое изображение, полученное в результате преобразования страницы PDF, представляет собой комбинацию всех объектов PDF, наложенных друг на друга, поскольку они находятся в области страницы. . (Конечно, вы можете обрезать только часть страницы, но это также дает вам комбинацию всех объектов PDF из обрезанной области...). Результаты этого вы сталкивались, когда пытались преобразовать все белые пиксели в прозрачные: поскольку изначально разные объекты сливаются в одно представление пикселей, вы больше не можете различать их как требуется.

Вам следует выбрать другой подход и использовать другой инструмент для извлечения изображения: используйте pdfimages (инструмент, использованный выше с параметром -list для отображения свойств изображения со страниц PDF) . Как видите, список содержит два изображения: одно — растровое изображение RGB, другое — растровое изображение в градациях серого, получившее название типа smask (мягкая маска).

Вот команда для извлечения обоих изображений в формате PNG:

 pdfimages -png dice.pdf dice-images

Это извлечет два:

  1. dice-images-0000.png (цветное изображение)
  2. dice-images-0001.png (изображение в градациях серого)

(Примечание. Только самые последние версии pdfimages, версии Poppler, позволяют извлекать изображения в формате PNG. В формате PDF нет такого понятия, как PNG. Есть только растровые данные, сжатые с Методы. Старые версии могут извлекать изображения только в формате PPM или PNM. Это не влияет на то, что я описываю ниже. Даже если вы извлекаете изображения PPM/PNM, эти два файла все равно можно обрабатывать, как описано ниже... )

Ниже приведен бок о бок, уменьшенный монтаж двух:

Цветное изображение из PDF (слева) с соответствующей программной маской (справа)

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

  1. то, что кажется полностью черным в софтмаске (справа), означает: этот пиксель реального изображения (слева) должен быть полностью прозрачным.
  2. то, что кажется полностью белым в софтмаске (справа), означает: этот пиксель реального изображения (слева) должен быть полностью непрозрачным.
  3. то, что отображается в оттенке серого в программной маске (справа), означает: этот пиксель реального изображения (слева) должен быть частично прозрачным (в соответствии с его уровнем серого/черного).

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

person Kurt Pfeifle    schedule 14.11.2014
comment
Чтобы объединить эти два файла (цветное изображение и софтмаску в градациях серого) обратно в один PNG с прозрачностью, вы можете использовать ImageMagick прямо сейчас... -- Какая команда ImageMagick для этого? то есть преобразовать -??? - person evandrix; 14.12.2015