无法使用PIL(Python图像库)将图像从PNG转换为JPG

时间:2019-02-27 06:12:48

标签: python python-imaging-library weasyprint

我在python中使用weasyprint库将HTML模板转换为png。然后我试图使用一个名为PIL(PILLOW)的python库将png图像转换为jpg。

PNG图片 如下所示。 enter image description here

但是使用PIL转换后获得的图像不是我所期望的。颜色消失了,只有图像的某些部分可见。

        from PIL import Image
        img = Image.open(file_path)
        rgb_im = img.convert('RGB')

        jpg_img_path = os.path.splitext(file_path)[0]
        jpg_img_path += '.jpg'
        rgb_im.save(jpg_img_path)

当我尝试使用在线编辑器时,他们为我提供了png的完美图像。 下面是从在线转换器获得的jpg图片enter image description here

还有使用 PIL 的图片。 enter image description here

4 个答案:

答案 0 :(得分:1)

这可能是完全错误的,但是我怀疑发生的事情是您的HTML渲染器为您提供了一个Alpha通道PNG,背景是透明的,然后通过.convert()变平为黑色。 如果我是对的,那么如果您创建与PNG大小相同的全白图像(或您喜欢的任何背景),并在convert()之前将PNG合成,则问题应该消失。和save()。 (执行此操作可能有一些更聪明的方法,它不需要您实际创建完整的背景图像,但这应该作为测试。)

答案 1 :(得分:1)

@Ture Palsson的答案是正确的,这是一个alpha问题。 您可以尝试使用一些here所示的PIL解决方法来摆脱它,或者使用一些我希望使用的非常简单的skimage代码:

from skimage.io import imread, imsave
from skimage.color import rgba2rgb
png = imread('UCLgy.png')
imsave('UCLgy.jpg', rgba2rgb(png, (1,1,1))) # 1, 1, 1 is white

答案 2 :(得分:0)

您可以使用imgkit python库将HTML直接转换为png

答案 3 :(得分:0)

问题是原始PNG图像具有一个JPEG不支持的Alpha层(即透明度)。最简单的方法是制作一个与原始图像大小相同但用白色填充的新图像,然后将透明图像粘贴到顶部:

#!/usr/bin/env python3

from PIL import Image

# Open image
im = Image.open('image.png')

# Make a background, same size filled with solid white
result = Image.new('RGB', (im.width,im.height), color=(255,255,255))

# Paste original image over white background and save
result.paste(im,im)
result.save('result.jpg')

因此,只需使用与现有模块相同的模块即可,而不会引入任何新的依赖关系。