一、背景

上一篇文章我们讲了怎么做自己的炫酷二维码,需要的移驾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. EF Code First 数据迁移配置

    这里我想讲清楚code first 数据迁移的两种模式,还有开发环境和生产环境数据迁移的最佳实践. 1.1 数据迁移综述 EF Code first 虽然已经有了几种不同的数据库初始化策略,但是大部分 ...

  2. jenkins构建基于gradle的springboot项目CI采坑(采用jar方式部署)

    试了一堆插件,最后用的还是 publish over SSH jenkins基本配置不多说了,就是配置一下git仓储,配置一下gradle执行命令 clean bootRepackage 之后执行Se ...

  3. DevOps之二 Maven的安装与配置

    CentOS7 安装Maven 一.安装Maven mkdir -p /usr/local/maven3wget http://mirrors.hust.edu.cn/apache/maven/mav ...

  4. UED团队规范设计参考及建议

    公司产品线逐渐增多,变动频繁且并行开发,常常需要设计与开发能够快速的做出响应.同时这类产品中有存在很多类似的页面以及组件,可以通过抽象得到一些稳定且高复用性的内容.通过模块化的解决方案,降低冗余的生产 ...

  5. quick-cocos2d-x与 cocos2d-x的关系

    quick-cocos2d-x(后文简称 quick)与 cocos2d-x 的关系,用一句话概括:quick 是 cocos2d-x 针对 Lua 的豪华套装威力加强版. 那 quick 与 coc ...

  6. AVL Tree 操作

    1.AVL树是带有平衡条件的二叉查找树, 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 2.AVL树的删除要比插入复杂.如果删除相对较少,那么用懒惰删除的方法是最好的策略. 3 ...

  7. Maven学习(四)-- Maven的核心概念

    摘自:http://www.cnblogs.com/xdp-gacl/p/4051819.html 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1. ...

  8. Unity3D学习(八):《Unity Shader入门精要》——透明效果

    前言 在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道. Unity中通常使用两种方法来实现透明 :(1)透明度测试(AlphaTest)(2)透明度混合(AlphaBlend).前者往 ...

  9. Linux下gcc和g++的区别

    首先编写了第一个C++程序,Hello,world! #include <iostream> using namespace std; void main() ...{ cout < ...

  10. c语言常见的几种排序方法总结

    一:选择排序和冒泡排序 这两种排序比较简单,直接贴出代码: #include <stdio.h> void choose_sort(int *arr, int n); void bubbl ...