Python Wand将PDF转换为PNG禁用透明度(alpha_channel)

7 浏览
0 Comments

Python Wand将PDF转换为PNG禁用透明度(alpha_channel)

我试图将一个PDF文件转换成PNG格式——这一切都很顺利,但是输出的图像仍然是透明的,尽管我相信我已经将透明度禁用了:\n

使用Image(filename='sample.pdf', resolution=300) as img:
    img.background_color = Color("white")
    img.alpha_channel = False
    img.save(filename='image.png')

\n上述代码产生了透明的图像,我还尝试了以下代码:\n

使用Image(filename='sample.pdf', resolution=300, background=Color('white')) as img:
    img.alpha_channel = False
    img.save(filename='image.png')

\n但是产生了以下错误:\n

Traceback (most recent call last):
  File "file_convert.py", line 20, in 
    with Image(filename='sample.pdf', resolution=300, background=Color('white')) as img:
  File "/Users/Frank/.virtualenvs/wand/lib/python2.7/site-packages/wand/image.py", line 1943, in __init__
    raise TypeError("blank image parameters can't be used with image "
TypeError: 不能将空白图像参数与图像打开参数一起使用

0
0 Comments

Python Wand 是一个用于处理图像的 Python 库,可以用来将 PDF 转换为 PNG 格式的图像。然而,有时候转换的结果可能会带有透明通道(alpha channel),而我们希望禁用透明通道以得到不带透明度的图像。

在上面的代码中,函数 convert_pdf() 实现了将 PDF 转换为 PNG 图像的功能。它通过使用 Wand 库中的 Image 对象来加载 PDF 文件,并设置分辨率。然后,对于 PDF 中的每一页,将其转换为 PNG 格式,并将透明通道替换为白色背景。最后,保存转换后的 PNG 图像到指定的输出路径。

然而,有时候我们可能希望禁用透明通道,即使 PDF 中包含了透明度信息。为了解决这个问题,我们可以在转换每一页的时候添加一行代码,将透明通道禁用。具体来说,在以下代码中添加一行 img.alpha_channel = 'off' 即可:

import os
from wand.image import Image
from wand.color import Color
def convert_pdf(filename, output_path, resolution=150):
    """ Convert a PDF into images.
        All the pages will give a single png file with format:
        {pdf_filename}-{page_number}.png
        The function removes the alpha channel from the image and
        replace it with a white background.
    """
    all_pages = Image(filename=filename, resolution=resolution)
    for i, page in enumerate(all_pages.sequence):
        with Image(page) as img:
            img.format = 'png'
            img.background_color = Color('white')
            img.alpha_channel = 'remove'
            img.alpha_channel = 'off'  # 禁用透明通道
            image_filename = os.path.splitext(os.path.basename(filename))[0]
            image_filename = '{}-{}.png'.format(image_filename, i)
            image_filename = os.path.join(output_path, image_filename)
            img.save(filename=image_filename)

通过添加这行代码,转换后的 PNG 图像将不再具有透明通道,而是完全不透明的图像。

这样,我们就解决了使用 Python Wand 将 PDF 转换为 PNG 并禁用透明通道的问题。使用上述修改后的代码,我们可以得到不带透明度的 PNG 图像。

0
0 Comments

从上面的内容可以看出,问题的出现原因是在使用Python的Wand库将PDF文件转换为PNG文件时,PNG文件中的透明通道(alpha_channel)没有被正确地禁用。为了解决这个问题,可以尝试创建一个带有背景颜色的空白图像,然后将PDF文件合成到这个空白图像上。

具体的解决方法如下:

使用Wand库导入Image和Color类:

from wand.image import Image
from wand.color import Color

使用Image类打开PDF文件,并设置分辨率为300:

with Image(filename="sample.pdf", resolution=300) as img:

使用Image类创建一个宽度和高度与PDF文件相同,并且背景颜色为白色的空白图像:

  with Image(width=img.width, height=img.height, background=Color("white")) as bg:

将PDF文件合成到空白图像上的左上角(坐标为0,0):

    bg.composite(img,0,0)

保存合成后的图像为PNG文件:

    bg.save(filename="image.png")

通过以上步骤,就可以正确地将PDF文件转换为PNG文件,并且禁用了PNG文件中的透明通道。

0
0 Comments

问题的原因是作者有一些需要将PDF转换为PNG的需求,但在转换过程中希望禁用透明通道(alpha channel)。

解决方法是使用Python库Wand来完成PDF到PNG的转换,并在转换的过程中禁用透明通道。具体的代码如下:

from wand.image import Image
from wand.color import Color
all_pages = Image(blob=self.pdf)        # PDF will have several pages.
single_image = all_pages.sequence[0]    # Just work on first page
with Image(single_image) as i:
    i.format = 'png'
    i.background_color = Color('white') # Set white background.
    i.alpha_channel = 'remove'          # Remove transparency and replace with bg.

这段代码使用Wand库来读取PDF文件,并将其转换成多个页面的Image对象。然后,我们选择第一页,并将其格式设置为PNG。接下来,我们设置背景颜色为白色,并禁用透明通道。

这个解决方法简单易懂,而且在安装了Wand和ImageMagick后可以节省很多调试时间。

参考链接:wand.image

这个方法非常简单,完美地解决了问题!

0