Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法

最近在用PIL合成PNG图像为GIF时,因为需要透明背景,所以就用putpixel的方法替换背景为透明,但是在合成GIF时,图像出现了重影,在网上查找了GIF的相关资料:GIF相关资料 其中有对GIF帧数处理的说明,需要在GIF图像的header中设置disposal的处置方法

然后我们可以查看PIL库中关于GIF的定义文件GifImagePlugin.py

 1 disposal = int(im.encoderinfo.get("disposal", 0))
 2
 3     if transparent_color_exists or duration != 0 or disposal:
 4         packed_flag = 1 if transparent_color_exists else 0
 5         packed_flag |= disposal << 2
 6         if not transparent_color_exists:
 7             transparency = 0
 8
 9         fp.write(
10             b"!"
11             + o8(249)  # extension intro
12             + o8(4)  # length
13             + o8(packed_flag)  # packed fields
14             + o16(duration)  # duration
15             + o8(transparency)  # transparency index
16             + o8(0)

其中有一段关于Disposal的定义,如果保存时不设置disposal属性则默认为0,即不使用处理方法,所以每一张PNG文件都被保留成了背景,也就是我们看到的重影,所以我们在合成GIF时,需要设置disposal值

原图:

下面是生成透明背景PNG图像代码:

 1 from PIL import Image
 2
 3 img = Image.open("dabai.gif")
 4 try:
 5     flag = 0
 6     while True:
 7         #获取每一帧
 8         img.seek(flag)
 9         #保存
10         img.save("pics/{}.png".format(flag))
11         pic = Image.open("pics/{}.png".format(flag))
12         #转化
13         pic = pic.convert("RGBA")
14         #替换背景为透明
15         color = pic.getpixel((0,0))
16         for i in range(pic.size[0]):
17             for j in range(pic.size[1]):
18                 dot = (i,j)
19                 rgba = pic.getpixel(dot)
20                 if rgba == color:
21                     rgba = rgba[:-1] + (0,)
22                     pic.putpixel(dot, rgba)
23         #保存
24         pic.save("pics/{}.png".format(flag))
25         flag +=1
26 except BaseException as e:
27     pass

合成GIF图像:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3
 4 from PIL import Image
 5 import os
 6 photo_list = []
 7 #获取保存的PNG图像
 8 pic_list = os.listdir("pics/")
 9 #对图像List排序,防止图像位置错乱
10 pic_list.sort(key=lambda x:int(x[:-4]))
11 for k in pic_list:
12     pic_p = Image.open("pics/{}".format(k))
13     photo_list.append(pic_p)
14 #保存图像,disposal可以为2或者3,但是不能为1或0,切记,其他自定义未尝试
15 photo_list[0].save("dabai_new.gif", save_all=True, append_images=photo_list[1:],duration=40,transparency=0,loop=0,disposal=3)

合成后图像,背景已变成透明而且未出现重影

原文地址:https://www.cnblogs.com/orange-wrj/p/12154032.html

时间: 2024-08-30 08:22:40

Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法的相关文章

Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法

原文:Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法 今天同事在做安装包的时候,有一个读取注册表路径的需求,需要根据读取的值来写配置文件,按照常规的做法,写好了注册表搜索方法,但是在测试的时候,发现总是会将系统盘下的Program Files\xxx路径读取为Program Files (x86)\xxx,如下图所示: 之后测试了如果读取非系统盘下的此路径,不会出现这个问题. 但是这个路径一般情况下都是默认安装在

《BI项目笔记》SSAS部署时发生的问题——元数据管理器中存在错误 解决办法

原文:<BI项目笔记>SSAS部署时发生的问题--元数据管理器中存在错误 解决办法 在生成和部署期间出错.是否继续?解决办法: 用Microsoft SQL Server Management Studio 连接Analysis Services 然后删除多维数据库,重新布署.这样就OK的.

Windows Server+AMD GPU+HDMI时_黑边_不铺满问题的解决办法

HDMI接显示器或电视,有黑边或者被放大了是个很常见的问题,显卡设置界面里改下Scale或者Overscan/Underscan就行,可问题是WindowsServer版的CCC没有控制颜色对比度和缩放的那个界面. 不怕,直接改注册表就好. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{Your Card GUID}\0000]"TVEnableOverscan"=dword:00000000"Digi

调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应用程序池-->右击-->高级设置-->打开如下图-->在加载用户配置文件选择true 3.如果以上两个方案都不能解决问题,就有可能是加载证书时没有给定证书存储标识 解决方法:在加载证书方法时使用以下方法,请注意第三个参数 X509Certificate2 cer = new X509C

调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应用程序池-->右击-->高级设置-->打开如下图-->在加载用户配置文件选择true 3.如果以上两个方案都不能解决问题,就有可能是加载证书时没有给定证书存储标识 解决方法:在加载证书方法时使用以下方法,请注意第三个参数 X509Certificate2 cer = new X509C

android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法

今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化.最后发现原因是 ListView滚动时自动调用 onCheckedChanged 导致的.在查看了各种博客的解决办法后,国外的网站上有一个办法解决了我的问题.写下来分享一下. 在自定义Adapter的getView方法中这样写就行了. Java代码   //在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件

ios弹出软键盘时fixed失效及点击空白处隐藏层的解决办法

一.实现点击按钮弹出层和点击空白处隐藏层,event.stopPropagation()是关键,阻止传导. <script type="text/javascript"> $(function () { $('#btnShow').click(function (event) { event.stopPropagation(); $('#div_apply').toggle(); }); $(document).click(function (event) { $('#di

本地Git仓库和远程仓库的创建和关联及github上传(git push)时出现error: src refspec master does not match any解决办法

github上传项目方法: 在你的电脑上装好git Git Bash Here 本地Git仓库和远程仓库的创建及关联大致流程是: 1.初始化这个本地的文件夹为一个Git可以管理的仓库 git init 注意:Git会自动为我们创建唯一一个master分支我们能够发现在当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了. 2.将本地的仓库和远程的仓库进行关联 git remote add origin [em

安装office2016时弹出microsoft setup bootstrapper已停止工作的解决办法

安装office2016时安装进度条走到最后又回滚,弹出microsoft setup bootstrapper已停止工作,最后"安装出错" 经过了1天的试尽了各种控制面板卸载.文件夹删除.office注册表删除等方法,最后用了以下方法才终于解决.希望没试过我这个方法的朋友们先试下这个方法.(⊙o⊙)- 确认启动Windows Event Log这个服务项.Windows系统的服务打开方式如下:在"运行"里输入services.msc,就可以打开了,或者通过计算机管