一、背景

上一篇文章我们讲了怎么做自己的炫酷二维码,需要的移驾Python-炫酷二维码,本片文章我们讲述下怎么把一张图片处理成字符版图片,就是说使用字符替代每个像素的颜色,形成一个由字符组成的图片,并且字符的颜色是由原始的图片像素颜色决定

二、准备环境

对图片的操作我们可以使用PIL、imageio和image2gif库,处理像素我们选择使用opencv-python这个库。NumPy是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。因此我们需要安装以下几个包:PIL、imageio、numpy、cv2、images2gif

 pip install pillow
pip install imageio
pip install numpy
pip install opencv-python
pip install images2gif

以上扩展包安装时应该都可以顺利安装,但使用的时候有几个坑

1、导入cv2时,如果发生找不到dll的情况,大多数的原因都是当前的python版本和opencv版本不匹配,pip安装时默认选择了最新的版本,因此我们安装时需要指定安装的版本pip install opencv-python==3.4.1.15

2、使用images2gif这个库时,可能会出现无法导入writeGif接口的情况这个时候需要改下源码,把images2gif.py文件中的两个from 后边加上英文点号,修改如下

 from .images2gif import readGif as readGif
from .images2gif import writeGif as writeGif

三、字符版动态图

首先我们需要搞清楚gif是个什么玩意儿,其实gif是将多幅图像保存为一个图像文件,从而形成动画,最常见的就是通过一帧帧的动画串联起来的搞笑gif图,所以归根到底gif仍然是图片文件格式。

什么?原来gif就是一帧一帧的图片,那么字符版动态图其实也就是字符版图片的连续播放,思考到这儿,我们有了如下思路:

1、拿到一张gif图

2、把fig图拆分成多张png图片,或者其他格式的图片

3、循环遍历拆分后的图片,并处理成字符版图片

4、把处理后的字符版图片在连接成一个guf文件

5、保存gif文件

通过以上5个步骤,我们即可实现我们的需求,是不是很简单,下边我们分布来讲解实现过程

四、gif和png转换

1、要想获得静态图片,我们需要有一个gif图,然后把gif图拆分成多张png图片,以下是3中处理gif图片的方式

方式1,使用Image

 def Gif2Png():
gif = Image.open(gifpath)
try:
while True:
current = gif.tell()
gif.save(saveFloder + "/%d.png" % current)
gif.seek(current + 1)
except:
pass

方式2,使用Image

 def Gif2Png_2():
try:
im = Image.open(gifpath)
except IOError:
print ("Cant load", gifpath)
sys.exit(1)
i = 0
mypalette = im.getpalette() try:
while 1:
im.putpalette(mypalette)
frame = im.convert('RGBA')
new_im = Image.new("RGBA", im.size)
#new_im.paste(im)
new_im.paste(frame)
new_im.save(saveFloder + "\\%d.png" % i) i += 1
im.seek(im.tell() + 1) except EOFError:
pass # end of sequence

方式3

 #使用imageio处理gif图
def Gif2Png_3():
images = imageio.mimread(gifpath)
#把上面的每帧图片进行保存
for i, img in enumerate(images):
img = np.asarray(img)
imageio.imwrite(saveFloder + "\\%d.png" % i, img)

生成png效果如下图所示

2、把图片处理成gif图,以下是处理的两种方式

方式1

 def Png2Gif():
fileOrder = sorted([int(os.path.splitext(x)[0]) for x in os.listdir(savePath)])
frames = []
for order in fileOrder:
filename = str(order)+ '.png'
filePath = savePath + "/" + filename
frames.append(imageio.imread(filePath)) imageio.mimsave(newFilePath, frames, 'GIF', duration = 0.1)

方式2

 def Png2Gif_2():
fileOrder = sorted([int(os.path.splitext(x)[0]) for x in os.listdir(savePath)])
filenames = [] # 存储所需要读取的图片名称
for order in fileOrder:
filename = str(order)+ '.png'
filePath = savePath + "/" + filename
filenames.append(filePath) # 将使用的读取图片汇总 frames = []
for image_name in filenames: # 索引各自目录
im = Image.open(image_name) # 将图片打开,本文图片读取的结果是RGBA格式,如果直接读取的RGB则不需要下面那一步
im = im.convert("RGB") # 通过convert将RGBA格式转化为RGB格式,以便后续处理
im = np.array(im) # im还不是数组格式,通过此方法将im转化为数组
frames.append(im) # 批量化
writeGif(newFilePath, frames, duration=0.1, subRectangles=False) # 生成GIF,其中durantion是延迟,这里是1ms

五、处理动态图片

生成字符版gif图时,如果把拆分开来的图片先进行保存硬盘,然后在进行图片处理在合成最终gif效率会比较慢,因此我们把整个过程都放在内容中处理,即拆分开来的png图片不进行存盘,而是直接处理,然后在合成gif图

 def Gif2Gif(gifpath):
A = []
images = imageio.mimread(gifpath)
#把上面的每帧图片进行保存
for img in images:
u, v, channels = img.shape
c = img * 0 + 255
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
for i in range(0, u, 6):
for j in range(0, v, 6):
pix = gray[i, j]
b, g, r, a = img[i, j]
zifu = string[int(((len(string) - 1) * pix) / 256)]
if a != 0:
cv2.putText(c, zifu, (j, i), cv2.FONT_HERSHEY_COMPLEX, 0.3, (int(b), int(g), int(r), int(a))) A.append(c) oldFileName = os.path.splitext(os.path.basename(gifpath))[0]
newFilePath = os.getcwd() + '/{}/'.format(saveFloder) + oldFileName +"_new.gif"
imageio.mimsave(newFilePath, A, 'GIF', duration=0.1)

源代码中是支持批量生成字符版gif图,测试生成效果如下图所示,左侧是原始图,右侧是生成的效果图

六、字符版动态二维码

有了普通的gif图生成动态二维码的方式,字符版gif图也就顺理成章的可以。

测试生成效果如下图所示,左侧是原始图,右侧是生成的效果图

七、源码下载

  需要全部代码的到csdn直接下载:Python-字符版gif图

转载声明:本站文章无特别说明,皆为原创,版权所有,转载请注明:朝十晚八

Python-字符版gif图的更多相关文章

  1. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

  2. 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门

    百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...

  3. 用Python实现一个Picgo图床工具

    PyPicGo PyPicGo 是一款图床工具,是PicGo是Python版实现,并支持各种插件自定义插件,目前PyPicGo自带了gitee.github.SM.MS和七牛云图传,以及rename. ...

  4. Anaconda 用于科学计算的 Python 发行版

    用于科学计算的 Python 发行版: 1.Anaconda  https://www.continuum.io/    公司continuum.  有商业版本. Anaconda is the le ...

  5. Python字符进度条

    Python字符进度条 看看这个神奇的module from tqdm import trange from time import sleep for r in trange(10, 1, -1): ...

  6. python scrapy版 极客学院爬虫V2

    python scrapy版 极客学院爬虫V2 1 基本技术 使用scrapy 2 这个爬虫的难点是 Request中的headers和cookies 尝试过好多次才成功(模拟登录),否则只能抓免费课 ...

  7. selenium webdriver (python) 第二版

    前言 对于大多软件测试人员来讲缺乏编程经验(指项目开发经验,大学的C 语言算很基础的编程知识)一直是难以逾越的鸿沟,并不是说测试比开发人员智商低,是国内的大多测试岗位是功能测试为主,在工作时间中,我们 ...

  8. python 字符编码练习

    通过下面的练习,加深对python字符编码的认识 # \x00 - \xff 256个字符 >>> a = range(256)>>> b = bytes(a) # ...

  9. Python字符编码讲解

    声明:本文参考 Python字符编码详解 在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果 计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节 ...

随机推荐

  1. 手把手教你全家桶之React(二)

    前言 上一篇已经讲了一些react的基本配置,本遍接着讲热更新以及react+redux的配置与使用. 热更新 我们在实际开发时,都有用到热更新,在修改代码后,不用每次都重启服务,而是自动更新.并而不 ...

  2. 当配置 DispatcherServlet拦截“/”,SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  3. 文本分类学习(六) AdaBoost和SVM

    直接从特征提取,跳到了BoostSVM,是因为自己一直在写程序,分析垃圾文本,和思考文本分类用于识别垃圾文本的短处.自己学习文本分类就是为了识别垃圾文本. 中间的博客待自己研究透彻后再补上吧. 因为获 ...

  4. 架构之ELK日志分析系统

    ELK多种架构及优劣 既然要谈ELK在大数据运维系统中的应用,那么ELK架构就不得不谈.本章节引出四种笔者曾经用过的ELK架构,并讨论各种架构所适合的场景和优劣供大家参考. 先大致介绍ELK组件.EL ...

  5. 前端开发APP,从HBuilder开始~ 【转】

    内容简介 介绍目前前端人员开发app的几种方法,具体介绍hbuilder开发app,一扇赞新的大门~ 无所不能的js 最开始js仅仅局限于网页上一些效果,操作网页内容等, 但是nodejs把js带入了 ...

  6. codeforces 979D Kuro and GCD and XOR and SUM

    题意: 给出两种操作: 1.添加一个数字x到数组. 2.给出s,x,k,从数组中找出一个数v满足gcd(x,k) % v == 0 && x + v <= s && ...

  7. linux常用的时间获取函数(time,gettimeofday,clock_gettime,_ftime,localtime,strftime )

    time()提供了秒级的精确度 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在的秒 ...

  8. SSM-SpringMVC-05:SpringMVC视图解析器InternalResourceViewResolver配置

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 视图解析器------默认就有配置,但是默认的在实际使用过程中有很多不方便的地方,所以我们配置一道视图解析器 ...

  9. [ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器

    上一章 [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis  介绍了Redis的初始化脚本文件及启动配置文件,并图解如何以服务的形式来启动.终止Redis服务,可以说我们的 ...

  10. RestTemplate 微信接口 text/plain HttpMessageConverter

    一.背景介绍 使用 Spring Boot 写项目,需要用到微信接口获取用户信息. 在 Jessey 和 Spring RestTemplate 两个 Rest 客户端中,想到尽量不引入更多的东西,然 ...