Как сделать прозрачный фон белым вместо черного при конвертации PDF в JPG с помощью PythonMagick

Я пытаюсь конвертировать из PDF в JPG, используя PythonMagick, но я не могу найти способ установить цвет фона, который по умолчанию изменяется с прозрачного на черный. Я могу получить желаемый результат, используя os.system и параметр -flatten, как показано ниже.

import os
os.system('convert -flatten -background \#ffffff -density 400 -adaptive-resize 1900x infile.pdf outfile.jpg')

Тем не менее, PythonMagick, похоже, не имеет flatten Метод и следующий фрагмент создает изображение с черным фоном.

import PythonMagick
import os
img = PythonMagick.Image("infile.pdf")
img.backgroundColor('#ffffff')
img.density('400')
img.resize('1900x')
img.magick('JPG')
img.quality(60)
img.write("outfile.jpg") 

Существует также метод transparent(), который принимает цвет. Я не совсем уверен, для чего это нужно, но img.transparent('#ffffff') не помогло. Есть ли другой способ добиться того же результата? Я бы предпочел не делать это с помощью os.system, так как это, кажется, занимает гораздо больше времени.

1 ответ

Решение

Если вы посмотрите на документацию для -flatten опция командной строки, вы увидите, что это псевдоним для -layers flatten,

-layers flatten Команда сама по себе является комбинированной командой, которая включает в себя создание слоя текущего цвета фона размером с первый холст изображений, а затем поочередно создаёт каждый слой поверх него.

PythonMagick - это просто связующий слой с интерфейсом Magick ++ C++. Расширенные команды, которые convert обеспечивает, не обязательно реплицируются в библиотеках нижнего уровня, так как они на самом деле представляют собой последовательность команд, как описано выше. Таким образом, хотя в библиотеке PythonMagick для нее нет единой команды, функциональность может быть реплицирована.

Метод, который вы ищете .composite() документация PythonMagick настолько ограничена (или вообще отсутствует), что большинство людей остаются в стороне от библиотеки. Но я думаю, что использование будет примерно таким, если в PDF-файле был только один слой (полностью непроверенный):

import PythonMagick

img = PythonMagick.Image("infile.pdf")

img.density('400')

bgColour = PythonMagick.ColorRGB(1.0, 1.0, 1.0)
size = "%sx%s" % (img.columns(), img.rows())

flattened = PythonMagick.Image(size, bgColour)
flattened.type = img.type

flattened.composite(img, 0, 0, PythonMagick.CompositeOperator.SrcOverCompositeOp)

flattened.resize('1900x')
flattened.magick('JPG')
flattened.quality(60)

flattened.write("outfile.jpg")

NB. Оператор композиции может быть PythonMagick.CompositeOperator.DstOverCompositeOp Я не уверен, с какой стороны это справится.

Хотя PDF-файлы - это особый случай с ImageMagick, так как они обычно передаются в ghostscript для растеризации. Это значит, что вам может понадобиться ghostscript (gs) некоторые странные параметры для правильной обработки альфа-канала. Попробуйте добавить подробные параметры к команде, которая работает, чтобы увидеть, какие команды делегата она выдает, и подумайте о том, чтобы выполнить растеризацию PDF самостоятельно через os.system('gs ...') команда, а затем делает изменение размера. Хотя я сомневаюсь, что это будет быстрее, чем просто позвонить convert,

Другие вопросы по тегам