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

然后我们可以查看PIL库中关于GIF的定义文件GifImagePlugin.py
disposal = int(im.encoderinfo.get("disposal", 0))
if transparent_color_exists or duration != 0 or disposal:
packed_flag = 1 if transparent_color_exists else 0
packed_flag |= disposal << 2
if not transparent_color_exists:
transparency = 0
fp.write(
b"!"
+ o8(249) # extension intro
+ o8(4) # length
+ o8(packed_flag) # packed fields
+ o16(duration) # duration
+ o8(transparency) # transparency index
+ o8(0)
其中有一段关于Disposal的定义,如果保存时不设置disposal属性则默认为0,即不使用处理方法,所以每一张PNG文件都被保留成了背景,也就是我们看到的重影,所以我们在合成GIF时,需要设置disposal值
原图:

下面是生成透明背景PNG图像代码:
from PIL import Image
img = Image.open("dabai.gif")
try:
flag = 0
while True:
#获取每一帧
img.seek(flag)
#保存
img.save("pics/{}.png".format(flag))
pic = Image.open("pics/{}.png".format(flag))
#转化
pic = pic.convert("RGBA")
#替换背景为透明
color = pic.getpixel((0,0))
for i in range(pic.size[0]):
for j in range(pic.size[1]):
dot = (i,j)
rgba = pic.getpixel(dot)
if rgba == color:
rgba = rgba[:-1] + (0,)
pic.putpixel(dot, rgba)
#保存
pic.save("pics/{}.png".format(flag))
flag +=1
except BaseException as e:
pass
合成GIF图像:
#!/usr/bin/env python
# -*- coding: utf-8 -*- from PIL import Image
import os
photo_list = []
#获取保存的PNG图像
pic_list = os.listdir("pics/")
#对图像List排序,防止图像位置错乱
pic_list.sort(key=lambda x:int(x[:-4]))
for k in pic_list:
pic_p = Image.open("pics/{}".format(k))
photo_list.append(pic_p)
#保存图像,disposal可以为2或者3,但是不能为1或0,切记,其他自定义未尝试
photo_list[0].save("dabai_new.gif", save_all=True, append_images=photo_list[1:],duration=40,transparency=0,loop=0,disposal=3)
合成后图像,背景已变成透明而且未出现重影

Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法的更多相关文章
- 编译驱动模块时,出现“stack protector enabled but no compiler support”[解决办法]【转】
转自:http://blog.chinaunix.net/uid-26847859-id-3297170.html 原文地址:编译驱动模块时,出现“stack protector enabled bu ...
- 关于压缩jar包时提示*.*没有这个文件或目录的问题以及解决办法:
关于压缩jar包时提示.没有这个文件或目录的问题以及解决办法: 问题描述: 我在打包jar时,CMD中进入到包的上一层目录. 在命令提示符中输入 提示如下: 从提示中可知没有找到我们想要打包的clas ...
- github上传时出现error: src refspec master does not match any解决办法
github上传时出现error: src refspec master does not match any解决办法 这个问题,我之前也遇到过,这次又遇到了只是时间间隔比较长了,为了防止以后再遇到类 ...
- 在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法。
在 root 下执行 Oracle 程序时找不到 libclntsh.so.11.1 错误的解决办法. 先确定 libclntsh.so.11.1 所在目录: [oracle@localhost ~] ...
- CAS (10) —— JBoss EAP 6.4下部署CAS时出现错误exception.message=Error decoding flow execution的解决办法
CAS (10) -- JBoss EAP 6.4下部署CAS时出现错误exception.message=Error decoding flow execution的解决办法 jboss版本: jb ...
- 执行shell脚本时提示bad interpreter:No such file or directory的解决办法
执行shell脚本时提示bad interpreter:No such file or directory的解决办法 故障现象:在终端直接cd /var正常,在shell脚本中执行则报错.原因是脚本是 ...
- Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法
原文:Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法 今天同事在做安装包的时候,有一个读取注册表路径的需求,需要根据 ...
- 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...
- 调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...
随机推荐
- Python基础:26模块
一:模块和文件 1:模块是逻辑上组织 Python 代码的方法,文件是物理层上组织模块的方法.因此,一个文件被看作是一个独立模块,一个模块也可以被看作是一个文件. 模块的文件名就是模块的名字加上扩展名 ...
- laravel5.6 QQ 第三方登录
https://socialiteproviders.github.io/providers/qq.html 1. Installation // This assumes that you have ...
- ODT模板
struct node{ int l,r; mutable int v; node(int L,int R,int V):l(L),r(R),v(V){} inline bool operator & ...
- CSS检测窗口大小显示和隐藏内容
代码不多 用css写的话简单一点 @media (max-width: 1024px) { #hidden { display: none; } } max-width 是要检测的宽度
- laravel使用加载进行优化
两种方式: 1.使用:with $posts=Post::orderby('created_at','desc')->withCount(['comments','zans'])->wit ...
- pip安装软件包报Could not fetch URL
报这个错误的原因是python.org已经不支持TLSv1.0和TLSv1.1了.更新pip可以解决这个问题,但是你不能用命令 pip install --upgrade pip 做更新,因为TLS证 ...
- Python--day70--ORM一对一表结构
ORM一对一表结构:
- js 制作分页
如图所示 在html中调用方法 getpage(7, 1, 1, 'URL') 1.page.js文件 代码 function getpage(count, countPage, pageIndex, ...
- 关于 vue 生命周期 钩子函数 事件
vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染->更新->渲染.卸载等一系列过程,我们称这是vue的生命周期. 通俗的将就是vue实例从创建到销毁 ...
- Python--day43--增删改查补充和limit以及order by
增删改查补充: 增: 删和改: 查: 其他: limit:(具有分页的功能) 分页: