【问题标题】:Unable to convert an image from PNG TO JPG using PIL (Python Image Library)无法使用 PIL(Python 图像库)将图像从 PNG 转换为 JPG
【发布时间】:2019-02-27 06:12:47
【问题描述】:

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

PNG 图像如下所示。

但是使用 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图片

以及我使用 PIL 时的图像。

【问题讨论】:

  • 请分享您使用 PIL 打开的 PNG 图片。

标签: python python-imaging-library weasyprint


【解决方案1】:

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

#!/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')

因此只需使用与您已有的相同的模块,而无需引入任何新的依赖项。

【讨论】:

    【解决方案2】:

    这可能是完全错误的,但我怀疑发生的情况是您的 HTML 渲染器为您提供了一个背景透明的 alpha 通道 PNG,然后通过 .convert() 将其展平为黑色。 如果我是对的,如果您创建一个与 PNG 大小相同的全白图像(或您喜欢的任何背景),然后在 convert()和保存()。 (可能有一些更聪明的方法,不需要您实际创建完整的背景图像,但这应该作为测试)。

    【讨论】:

      【解决方案3】:

      @Ture Palsson 的答案是正确的,这是一个 alpha 问题。 您可以尝试使用一些 PIL 解决方法来摆脱它,如 here 所示,或者您使用一些非常简单的 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
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多