文章目录

  • 一、背景
  • 二、准备环境
  • 三、字符版动态图
  • 四、gif和png转换
  • 五、处理动态图片
  • 六、字符版动态二维码
  • 七、源码下载

原文链接: Python-字符版gif图

一、背景

上一篇文章我们讲了怎么做自己的炫酷二维码,需要的移驾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

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

def Gif2Png_2():try:im = Image.open(gifpath)except IOError:print ("Cant load", gifpath)sys.exit(1)i = 0mypalette = 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 += 1im.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)

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 + "/" + filenameframes.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 + "/" + filenamefilenames.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.shapec = img * 0 + 255gray = 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图也就顺理成章的可以。
测试生成效果如下图所示

七、源码下载

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

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!

很重要–转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords

  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。


Python-字符版gif图相关推荐

  1. Python制作字符版gif图

    一.背景 本片文章我们讲述下怎么把一张图片处理成字符版图片,就是说使用字符替代每个像素的颜色,形成一个由字符组成的图片,并且字符的颜色是由原始的图片像素颜色决定 二.准备环境 对图片的操作我们可以使用 ...

  2. Python学习,用python制作字符版gif图

    一.背景 本片文章我们讲述下怎么把一张图片处理成字符版图片,就是说使用字符替代每个像素的颜色,形成一个由字符组成的图片,并且字符的颜色是由原始的图片像素颜色决定 二.准备环境 对图片的操作我们可以使用 ...

  3. #Python #字符画 #灰度图 使用Python绘制字符画及其原理

    由于最近身体状况不太好所以更新会有点慢,请大家多多包涵.同时也提醒大家注意保重身体! 前提:默认大家已经正确安装了 Python,且正确将Python配置到了系统Path . 目录 1.字符画的概况 ...

  4. python频域三维图_深入浅出通信原理连载1-21(Python代码版)

    深入浅出通信原理Python代码版 深入浅出通信原理是陈爱军的心血之作,于通信人家园连载,此处仅作python代码笔记训练所用 陈老师的连载从多项式乘法讲起,一步一步引出卷积.傅立叶级数展开.旋转向量 ...

  5. python语言软件-mPython(图形化编程软件) V0.5.0 官方版

    mPython 是一款针对Python 3编程语言的图形化编辑工具.支持函数,仿真.hex.python.blockly三种代码读写等功能.并可以与TPYBoard系类开发板配合使用,直接连接PC端进 ...

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

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

  7. python发行版是什么意思_Python(40)常见问题:编程常见问题

    编程常见问题 目录 编程常见问题 如何创建 .pyc 文件? 如何找到当前模块名称? 如何让模块相互导入? __import__('x.y.z') 返回 ; 如何获取z? 当我编辑了导入过的模块并重新 ...

  8. BUCTOJ - 2023上半年ACM蓝桥杯每周训练题-1-A~K题C++Python双语版

    文章目录 BUCTOJ - 2023上半年ACM&蓝桥杯每周训练题-1-A~K题C++Python双语版 前言 问题 A: 1.2 神奇兔子数列 题目描述 输入 输出 解题思路 AC代码 C+ ...

  9. python手机版-python手机版

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 也许你会说为什么不导入到电脑上进行删除,没办法我就是想整点不一样的,学了 ...

最新文章

  1. 湘潭大学计算机科学与技术录取分数线,2016年湘潭大学计算机科学与技术专业在湖南录取分数线...
  2. SAP CRM里使用BAdI阻止产品主数据保存的一种办法
  3. 注册窗口类 registerclass
  4. 【转】VTK修炼之道2_VTK体系结构1
  5. 【AI视野·今日CV 计算机视觉论文速览 第156期】Mon, 9 Sep 2019
  6. mysql存储业务日志_MySQL 日志管理
  7. Android 性能优化——之控件的优化
  8. 鸿蒙来了!能否与安卓、iOS三足鼎立?
  9. 7000条短信接口!福利赠送!
  10. 中科院分词系统整理笔记
  11. 【小米商城首页简单设计】
  12. VMware上Ubuntu联网(NAT方式)
  13. 【渝粤题库】陕西师范大学202131组织行为学作业(高起本、专升本)
  14. RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解
  15. 2016年7月的数据省市区数据
  16. 什么是大数据和大数据平台?
  17. 京东云申元庆:用创新技术改变中国,顺道改变世界
  18. VMware虚拟机中摄像头打开显示黑屏或者摄像头打开无法弹出窗口的解决办法
  19. jquery获取父元素下的第n个子元素
  20. LPN管理中涉及到的LPN过多不能释放,导致在调拨环节零散LPN太多,如何解决该问题?

热门文章

  1. ubuntu 运行c语言文件路径,ubuntu上解压目录里的文件到指定文件夹
  2. 新媒体推广之今日头条
  3. 今日头条SEO优化如何解决品牌推广难题
  4. 从上帝视角看进程调度
  5. 【论文阅读】SCRDet:Towards More Robust Detection for Small, Cluttered and Rotated Objects
  6. Nvidia Isaac Sim ROS机器人仿真和AMR开发环境
  7. 【C语言作业7】猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示:“Right”,否则提示“Wrong”,并告诉人所猜的数是大还是小。
  8. HTML5相关的知识。
  9. 用树莓派学Linux(三)--------SSH端口转发,跳出局域网的树莓派控制
  10. 至快乐的11.11---牛X光棍的呐喊!(转)