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设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...
随机推荐
- ElementUI分页Pagination自动到第一页
当数据量过多时,使用分页请求数据. 设置分页的页数自动回到第一页. 例: <div class="pagination"> <el-pagination back ...
- PHP会话技术
由于HTTP协议是无连接.无状态的,所以HTTP协议无法记住客户端的信息.为了弥补HTTP协议的这两种不足,所以出现了会话技术. 1 Cookie技术 1.1 什么是Cookie 服务器端,将能够唯一 ...
- CSS定位方式有哪些?position属性的值有哪些?他们之间的区别是什么?
在CSS中关于定位的内容是:position:relative | absolute | static | fixed • static 自动定位,自动定位就是元素在页 面普通文档流中由HTML自动定 ...
- hdu 2069 Coin Change(完全背包)
Coin Change Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 1016 Prime Ring Problem(dfs)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Python--day43--增删改查补充和limit以及order by
增删改查补充: 增: 删和改: 查: 其他: limit:(具有分页的功能) 分页:
- Python--day41--线程池--python标准模块concurrent.futures
1,线程池代码示例:(注:进程池的话只要将以下代码中的ThreadPoolExecutor替换成ProcessPoolExecutor即可,这里不演示) import time from concur ...
- 【js】 vue 2.5.1 源码学习(六) initProxy initLifeCycle 渲染函数的作用域代理
大体思路 (五) 1. initProxy 渲染函数的作用域代理 ==> es6 如果支持proxy (hasProxy) 就用proxy 不支持就用 defineProperty() prox ...
- P1000 A+B Problem
题目描述 给定两个整数\(a,b\),输出它们的和. 输入格式 输入两个整数,表示\(a,b(1 \le a,b \le 10^9)\). 输出格式 输出一个整数,表示答案. 样例输入 20 30 样 ...
- C# 高级面试题
很少会有人可以答对,如果你遇到一个来面试的人实在嚣张,就可以用本文的题去打击 本文内容就看着玩,请不要在严肃的面试中问题这样的题目 如果面试到一个人可以回答出下面的题目也不能证明他的技术很强,只能说明 ...