PNG转JPEG时透明背景出现像素噪点如何解决?
透明PNG转JPEG背景噪点解决方案
问题根源
直接调用PIL的convert('RGB')方法转换带alpha通道的PNG时,会直接丢弃透明通道信息。半透明的投影区域原始RGB值本身偏暗,没有和预期的白色背景混合就直接保存,就会出现你观测到的黑色噪点、异常阴影问题。
解决方法
先创建和原图尺寸一致的纯白色背景,将带透明通道的PNG图像复合到纯白背景上,再转换为RGB格式保存即可,修正后的代码如下:
import requests from PIL import Image # 保存PNG部分逻辑保持不变 response = requests.get(image_url, headers = header) png_path = "%s-%s.png" % (slug, item_id,) with open(png_path, "wb") as file: file.write(response.content) # 修正后的PNG转JPEG逻辑 im1 = Image.open(png_path) # 先判断是否存在透明通道 if im1.mode in ('RGBA', 'LA') or (im1.mode == 'P' and 'transparency' in im1.info): # 生成纯白背景 white_background = Image.new('RGB', im1.size, (255,255,255)) # 以alpha通道为遮罩将原图粘贴到白色背景上 white_background.paste(im1, mask=im1.getchannel('A')) final_image = white_background else: # 无透明通道直接转换 final_image = im1.convert('RGB') # 保存时可指定quality参数降低压缩损失,取值范围1-100,默认值为75 final_image.save(filepath_normal, quality=95)
补充说明
如果对JPEG画质要求较高,可适当调高save方法的quality参数,避免JPEG压缩本身引入额外噪点。
内容的提问来源于stack exchange,提问作者rihekopo
相关产品推荐
相关产品推荐

