简单实现将GIF图片转换为字符画

2023-05-16

单单只是将静态图转换为字符画,功能貌似太过单一。
于是,小编便想着,既然静态图可以转换为字符画,那么动态图是否也可以呢。
毕竟,动态图不也就是许多静态图拼凑在一起生成的吗?
本次教学中,我将教大家如何简单的实现将动态图也转换为字符画。
这里写图片描述
以下是具体代码,我都做了详细注释,可以将图片保存下来慢慢看,遇到什么问题也可以私信我:

#-*- coding:utf-8 -*-
from PIL import Image, ImageFont, ImageDraw
import argparse
import os
import imageio
#命令行输入参数处理
parser = argparse.ArgumentParser()
parser.add_argument('file')
parser.add_argument('-d','--duration',type = float, default = 1)#播放时间
#获取参数
args = parser.parse_args()
File = args.file
DURARION = args.duration
#像素对应ascii码

#ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
ascii_char = list("MNHQ$OC67+>!:-. ")
#将像素转换为ascii码
def get_char(r,g,b,alpha = 256):
    if alpha == 0:
        return ''
    length = len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    unit = (256.0+1)/length
    return ascii_char[int(gray/unit)]
#将txt转换为图片
def txt2png(file_name):
    im = Image.open(file_name).convert('RGB')
    #gif拆分后的图像,需要转换,否则报错,由于gif分割后保存的是索引颜色
    raw_width = im.width   
    raw_height = im.height
    width = int(raw_width/6)
    height = int(raw_height/15)
    im = im.resize((width,height),Image.NEAREST)
    txt=""
    colors = []
    for i in range(height):
        for j in range(width):
            pixel = im.getpixel((j,i))
            colors.append((pixel[0],pixel[1],pixel[2]))
            if(len(pixel) == 4):
                txt += get_char(pixel[0],pixel[1],pixel[2],pixel[3])
            else:
                txt += get_char(pixel[0],pixel[1],pixel[2])        
        txt += '\n' 
        colors.append((255,255,255))
    im_txt = Image.new("RGB",(raw_width,raw_height),(255,255,255))
    dr = ImageDraw.Draw(im_txt)
    font=ImageFont.load_default().font
    x=y=0
    font_w,font_h=font.getsize(txt[1])    #获取字体的宽高
    font_h *= 1.37 #调整后更佳
    #ImageDraw为每个ascii码进行上色
    for i in range(len(txt)):
        if(txt[i]=='\n'):
            x+=font_h
            y=-font_w
        dr.text([y,x],txt[i],colors[i])
        y+=font_w
    name = file_name.split('.')[0]+'-txt'+'.png'
    print(name)
    im_txt.save(name)
#拆分gif
def gif2png(file_name):
    im = Image.open(file_name)
    path = os.getcwd()
    if(not os.path.exists(path+"/Cache")):
        os.mkdir(path+"/Cache")
    os.chdir(path+"/Cache")
    try:
        while 1:
            current = im.tell()
            name = file_name.split('.')[0]+'-'+str(current)+'.png'
            im.save(name)#gif分割后保存的是索引颜色
            print(name)
            txt2png(name)
            im.seek(current+1)
    except:
        os.chdir(path)
#转换为gif
def png2gif(dir_name):
    path = os.getcwd()
    os.chdir(dir_name)
    dirs = os.listdir()
    images = []
    num = 0
    for d in dirs:
        if d.split('-')[-1] == 'txt.png':
            images.append(imageio.imread(d))
            num += 1
    os.chdir(path)
    imageio.mimsave(d.split('-')[0]+'-txt_c.gif',images,duration = DURARION)
if __name__=='__main__':
    gif2png(File)
    path = os.getcwd()
    png2gif(path+"/Cache")

其实上述的编程思想很简单,只需要掌握步骤,你也可以轻松的实现以上功能,大体思想如下:
这里写图片描述
其中的关键在以下几点:
1、将gif图片拆分

  • 通过生成Cache文件夹进行存储

2、将gif图片合成,其中duration的设定

  • 通过加入参数-d来规定,具体操作如下:
    python ascii-gif.py 1.gif -d 0.1
    意为生成循环周期为0.1秒的gif图片

可能的问题:
window平台下在cmd终端使用pip安装imageio库时,可能会出现UnicodeDecodeError
解决方法:
安装的python路径里面的:\lib\site-packages\pip\compat__init__.py”, line 75中的utf-8改为gbk

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单实现将GIF图片转换为字符画 的相关文章

  • Rust Web框架warp使用

    目录 简介快速开始Request和Response从path和body中获取参数从query中获取参数 设置状态码 静态文件 目录websocket重定向tls 简介 warp是一个超级便捷 可组合 速度极快的异步Web框架 目前最新版本为
  • CCNP路由实验之四 动态路由协议之EIGRP

    CCNP 路由实验之四 动态路由协议之 EIGRP 动态路由协议可以自动的发现远程网络 xff0c 只要网络拓扑结构发生了变化 xff0c 路由器就会相互交换路由信息 xff0c 不仅能够自动获知新增加的网络 xff0c 还可以在当前网络连
  • C++中typedef用法说明

    typedef声明提供了一种将标识符声明为类型别名的方法 xff0c 用于替换复杂的类型名 解释 在声明中使用typedef说明符时 xff0c 会指定这个声明是typedef声明 xff0c 而不是变量或函数声明 通常 xff0c typ
  • Ubuntu 服务配置(sysv-rc-conf)

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 sudo apt get install sysv rc conf sudo sysv rc conf 运行级别说明 xff1a S表示开机后就会运行的服务0表示关
  • 安装vnc的各种悲剧解决

    系统 环境 VM 43 RHEL5 1 root 64 localhost vnc uname r 2 6 18 53 el5xen 本地XP系统安装 VNCVIEW去控制VM中的RHEL5 1 下面在LINUX上安装VNCSERVER 1
  • iOS基础 UITabBarController

    使用 创建子控制器继承自UITabBarController xff0c 在viewDidLoad阶段 xff0c 把各个分页上的控制器给创建好 xff0c 用UITabBarController的方法addChildControoler相
  • 插入内核模块失败提示"Invalid module format"

    产品需要编译自己的定制内核 43 内核模块 xff0c 下载内核源码定制修改后rpmbuild方式 点击打开链接 编译升级内核 xff0c 如下方式编译内核模块 make C kernel source SUBDIRS 61 96 pwd
  • microsoft visual c++ build tools

    因为visual studio的安装包太大 xff0c 所以在不需要开发的情况下 xff0c 可以选择使用microsoft visual c 43 43 build tools安装c 43 43 编译器 xff0c 这个工具会小很多 安装
  • C++ 应用程序 内存结构 --- BSS段,数据段,代码段,堆内存和栈

    转自 xff1a http hi baidu com C6 BF D6 D0 B5 C4 C5 AE CE D7 blog item 5043d08e741075f3503d922c html ld 时把所有的目标文件的代码段组合成一个代码
  • 4.1 简单题 - B 恭喜你

    当别人告诉你自己考了 x 分的时候 xff0c 你要回答说 xff1a 恭喜你考了 x 分 xff01 比如小明告诉你他考了90分 xff0c 你就用汉语拼音打出来 gong xi ni kao le 90 fen 输入格式 xff1a 输
  • <script>在页面代码上没有显示

    记录一下 导入js文件 xff0c 自己路径都没有问题 xff0c 为什么在浏览器查看页面代码没有自己写的那行js导入文件的代码呢 xff0c 原来 xff0c 是之前看着不舒服 xff0c 点了exclude xff0c exclude是
  • 利用Rust构建一个REST API服务

    利用Rust构建一个REST API服务 关注公众号 xff1a 香菜粉丝 了解更多精彩内容 Rust 是一个拥有很多忠实粉丝的编程语言 xff0c 还是很难找到一些用它构建的项目 xff0c 而且掌握起来甚至有点难度 想要开始学习一门编程
  • 安装cmake3.22

    升级cmake版本 脚本 span class token assign left variable file name span span class token operator 61 span cmake 3 22 0 yum era
  • stdout stderr 重定向到文件

    1 stdout stderr 重定向 1 stdout stderr 重定向 1 1 dup dup2 重定向到已打开文件 或 新文件1 2 freopen 重定向到新文件1 3 命令行重定向1 4 参考资料 1 1 dup dup2 重
  • 逆向基础-Windows驱动开发(一)

    Windows内核开发 第一个驱动程序 环境配置 xff1a 安装WDK xff1a WDK版本与SDK保持一致 然后记得把Spectre Mitigation给Disabled掉 xff0c 就不用去下载漏洞补丁了 然后在内核层 xff0
  • json-c 理解记录

    1 json c 理解记录 1 json c 理解记录 1 1 编译及说明1 2 特色1 3 使用 1 3 1 创建 xff0c 读写文件1 3 2 拷贝1 3 3 增改 1 3 3 1 字典增加元素1 3 3 2 数组增加修改元素 1 3
  • valgrind 简介(内存检查工具)

    1 valgrind 简介 1 valgrind 简介 1 1 概图1 2 特点1 3 使用示例1 4 参数说明 1 4 1 常用参数1 4 2 展示1 4 3 子进程 动态加载库及记录时机1 4 4 查错内存优化1 4 5 其他不常用1
  • GObject学习教程---第一章:GObject是有用并且简单的

    索引 xff1a https blog csdn net knowledgebao article details 84633798 本文是学习学习他人的博客的心得 xff08 具体详见 楼主见解 xff09 xff0c 如果源网站可访问的
  • GObject学习教程---第二章:模拟类的数据封装形式

    索引 xff1a https blog csdn net knowledgebao article details 84633798 本文是学习学习他人的博客的心得 xff08 具体详见 楼主见解 xff09 xff0c 如果源网站可访问的
  • 音视频中的PTS和DTS及同步

    相关索引 xff1a https blog csdn net knowledgebao article details 84776869 视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程 xff0c 就像在一个本子的每一

随机推荐

  • h264和h265的区别

    相关索引 xff1a https blog csdn net knowledgebao article details 84776869 目录 1 H 264与H 265的主要差异 2 xff0c 压缩性能比较 3 各模块技术差异汇总 4
  • StreamEye使用说明

    编译相关索引 xff1a https blog csdn net knowledgebao article details 84973055 官网 xff1a https www elecard com products video ana
  • libc.so库简介

    相关链接 xff1a https blog csdn net knowledgebao article details 84315842 问题一 xff1a 比如不小心把软连接libc so 6删除了 xff0c 只要执行ldconfig
  • CentOS 7.6安装OpenStack Stein版本

    文章目录 一 前提1 1设置四节点1 2网络平台架构1 3准备环境 所有节点 1 3 1设置hosts1 3 2设置主机名1 3 3关闭 firewalld1 3 4关闭SELinux1 3 5设置静态IP1 3 6自定义yum源1 3 7
  • SQLite使用

    1 创建表 xff0c 以及更新表结构 public class MySQLiteOpenHelper extends SQLiteOpenHelper public MySQLiteOpenHelper Context context s
  • 数据结构实验之栈与队列八:栈的基本操作

    Problem Description 堆栈是一种基本的数据结构 堆栈具有两种基本操作方式 xff0c push 和 pop push一个值会将其压入栈顶 xff0c 而 pop 则会将栈顶的值弹出 现在我们就来验证一下堆栈的使用 Inpu
  • 解决SpringSecurity阻止ajax的POST和PUT请求,导致403Forbidden的问题

    解决SpringSecurity阻止ajax的POST和PUT请求 xff0c 导致403Forbidden的问题 参考文章 xff1a xff08 1 xff09 解决SpringSecurity阻止ajax的POST和PUT请求 xff
  • Input.GetTouch 获取触摸

    Input GetTouch 获取触摸 static function GetTouch index int Touch Description 描述 Returns object representing status of a spec
  • Python-Pandas(1)数据读取与显示,数据样本行列选取

    span class hljs keyword import span pandas food info 61 pandas read csv span class hljs string 34 food info csv 34 span
  • 回归模型-线性回归算法

    线性回归算法 问题分为有监督问题和无监督问题两类 当用到标签来划分的时候就是有监督问题 xff0c 当没有用标签值的时候就是无监督问题 线性回归求解的结果是值 比如 xff1a 根据工资和年龄来预测出一个具体的值 xff0c 根据工资和年龄
  • 时间序列(三)滑动窗口

    滑动窗口就是能够根据指定的单位长度来框住时间序列 xff0c 从而计算框内的统计指标 相当于一个长度指定的滑块在刻度尺上面滑动 xff0c 每滑动一个单位即可反馈滑块内的数据 span class hljs import span clas
  • 时间序列(四)ARIMA模型与差分

    ARIMA模型 平稳性 xff1a 平稳性就是要求经由样本时间序列所得到的拟合曲线 在未来的一段期间内仍能顺着现有的形态 惯性 地延续下去 平稳性要求序列的均值和方差不发生明显变化 严平稳与弱平稳 xff1a 严平稳 xff1a 严平稳表示
  • 时间序列(五)股票分析

    首先导入相关模块 span class hljs keyword import span pandas span class hljs keyword as span pd span class hljs keyword import sp
  • Windows下Node多版本管理

    Windows下Node多版本管理 相关指令背景介绍GNVM 相关指令 查看node版本 node v 查看npm版本 span class token function npm span v 查看gnvm版本 gnvm version g
  • Notepad++与NodeJS

    文章目录 背景介绍理论分析实践操作结果展示 背景介绍 前段时间 xff0c 弄了张流量卡 xff0c 感觉线上查询太费劲了 不妙 xff0c 干脆通过NodeJS写个小软件来 xff0c 实时查询 程序员 xff0c 就是要方便自己嘛 哎
  • 傻瓜式Linpack安装(Mpich+Openblas+Hpl)

    Linpack安装 安装信息安装Mpich安装Openblas安装Hpl 参考资料 Linpack安装 安装信息 安装平台是Ubuntu16 04使用的是Mpich 43 Openblas 43 HplCPU架构为 Intel Nehale
  • [洛谷]P1591 阶乘数码 (#高精度 -1.2)

    题目描述 求n 中某个数码出现的次数 输入输出格式 输入格式 xff1a 第一行为t 10 xff0c 表示数据组数 接下来t行 xff0c 每行一个正整数n 1000 和数码a 输出格式 xff1a 对于每组数据 xff0c 输出一个整数
  • Ubuntu下Java安装(傻瓜式)

    准备安装Java xff0c 简单记录一下 xff1a 分为三步 Java安装Java环境配置测试Hello World xff01 小问题 Java安装 Ubuntu下很简单 xff0c 只需要 JAVA SE下载地址 选择自己的安装平台
  • 简单实现图片转彩色字符画

    在上次的教程中 xff0c 我们只是将图像转换为txt文本文件 xff0c 而txt文本文件是没有颜色的 在显示某些图片的时候 xff0c 我们往往希望可以包含颜色信息 这样图像便显得更加生动 接下来我便教大家如何将图像转换字符画的时候 x
  • 简单实现将GIF图片转换为字符画

    单单只是将静态图转换为字符画 xff0c 功能貌似太过单一 于是 xff0c 小编便想着 xff0c 既然静态图可以转换为字符画 xff0c 那么动态图是否也可以呢 毕竟 xff0c 动态图不也就是许多静态图拼凑在一起生成的吗 xff1f