我正在尝试使用PythonMagick从PDF转换为JPG,但我找不到设置背景颜色的方法,默认情况下,背景颜色从透明变为黑色。我可以使用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
来做,因为它似乎需要更长的时间。
答案 0 :(得分:4)
如果查看-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
)一些奇怪的参数来正确处理alpha通道。尝试向命令添加详细选项,以查看它发出的委托命令,并考虑通过os.system('gs ...')
命令自行执行PDF光栅化,然后执行调整大小。虽然我怀疑这会比调用convert
更快。