将 PNG 转换为 JPEG 会在背景中产生像素噪声

Converting PNG to JPEG creates pixel noise in the background

我必须将一些具有透明背景的 PNG 转换为简单的 JPEG,其中透明背景变为白色(我假设默认情况下会发生)。我已经尝试了所有可以在这里找到的解决方案,但是在将 PNG 保存为 JPEG 后,图像将如下所示:(PNG 上的噪点区域是透明的,黑色是投影)

转换后的图像

原图

这是我使用的代码:

# save the PNG 
response = requests.get(image_url, headers = header)
file = open("%s-%s.png" % (slug, item_id,), "wb")
file.write(response.content)
file.close()

# open the PNG and save as a JPEG
im1 = Image.open(filepath_to_png)
rgb_im = im1.convert('RGB')
rgb_im.mode
rgb_im.save(filepath_normal)

我的问题是如何防止 JPEG 具有损坏的背景?我的目标只是让 JPEG 格式的图像与 PNG 格式的图像相同。

您用于转换为 RGB 的方法适用于一些只需要直接转换的图像,例如具有硬边透明蒙版的图像,但对于具有软边蒙版的图像(例如中的透明阴影)你的图像)它不是有效的,因为转换不知道如何处理 半透明

处理此问题的更好方法是创建一个具有相同尺寸的新 Image 并用白色背景填充它,然后您只需粘贴原始图像:

new_im = Image.new( "RGB", im1.size, ( 255,255,255 ) )
new_im.paste( im1, im1 )
new_im.save( filepath_normal )

我已经使用带有软边蒙版的图像测试了这种方法并获得了以下 result:

您可以在 python 中使用 pillow 库。

from PIL import Image
im = Image.open("1.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save("2.jpg")

我得到的结果是透明背景变成了白色。