Python教程:如何用PIL将图片转换为ASCII艺术

news2024/11/14 16:48:27

Python教程:如何用PIL将图片转换为ASCII艺术

ASCII 艺术是一种将图像转换为由字符组成的艺术形式。Python 是一种灵活而强大的编程语言,可以使用它来将图片转换为 ASCII 艺术。本文将介绍如何使用 Python 和 PIL 库来实现这一功能。

文末有完整代码

效果

先上图看效果

原图

在这里插入图片描述

ASCII 艺术图

%%%@@%#*++++++++++++++++++++++++++++++++++*#%@@%%%
%@@%*++++++++++++++++++++++++++++++++++++++++*%@@%
@%*+=+++++++++++++==++++++==+++++++++++++++++=+*%@
%*=+++++++++++++++*##%%%%%#*++====+++++++++++++=*%
*=++++++++++++++#%%%#****#%%%#*****++=++++++++++=*
++++++++++++==*%@#++====+*#%@%%%%%%%%#++++++++++++
+++++++++=++*#%@#++=++*#%%%#*++++++*#%%#++++++++++
+++++++++*%%%%@%+++*%%%#*++=++**++===+%@#+++++++++
++++++++%@%*+*@%+++%@*+==+*#%%%%%#*++=+%@*++++++++
+++++++%@#+==#@%+++%@*+*#%@%*+++*%%%%#*%@#=+++++++
+++++=#@%+++=#@%+++%@%%%##%%%#*+==+*#%@@%*=+++++++
+++++=#@%+++=#@%+=+%@#++==++#@%%#*++=+*#@%*+++++++
+++++++%@#+++*%%%#*%@*=++++=*@%*#%%%*+=+#@%+++++++
+++++++*%@#*+=++*#%%@#++==++#@%+=+%@*=+++%@*=+++++
+++++++=*@@@%#*+==+*#%%%##%%%@%+++%@*=+++%@*=+++++
++++++++#@%*#%%%%*+++*%@%#*+*@%+++%@*==+#@%+++++++
++++++++*@%+=++*#%%%%%#*+==+#@%+++%@*+*%@%++++++++
+++++++++%@%+====+**++=++*%%%%*+++%@%%%%*+++++++++
++++++++++#%%#*++++++*#%%%#*+++++#@%#*++=+++++++++
++++++++++++#%%%%%%%%@%#*+====++#@%*==++++++++++++
*+++++++++++=++*****#%%%#****#%%%#++++++++++++++++
%*=+++++++++++++====++*#%%%%%##*+=++++++++++++++++
@%*+=++++++++++++++++++=++++++=+++++++++++++++++++
%@@#*+++++++++++++++++++++++++++++++++++++++++++++
%%%@@%#*++++++++++++++++++++++++++++++++++++++++++

准备工作

在开始之前,需要确保已经安装了 Python 和 PIL 库。可以使用以下命令检查是否已经安装了 PIL 库:

import PIL
print(PIL.__version__)

如果输出了 PIL 库的版本信息,则说明已经安装成功。

加载图片

首先,需要加载一个 PNG 格式的图片,并将其转换为 RGB 格式。可以使用 PIL 库的 Image.open() 函数来加载图片,使用 convert() 方法将其转换为 RGB 格式:

from PIL import Image
# 直接将图片放再相同的目录,写名字就可以了
# 加载 PNG 图像
image = Image.open("xxx.png").convert('RGB')

调整图片大小

将图片转换为 ASCII 艺术时,需要将其调整为适当的大小。可以使用 resize() 方法来调整图片的大小:

# 调整图像大小
width, height = image.size
aspect_ratio = height / width
new_width = 50
new_height = int(new_width * aspect_ratio * 0.55)  # 调整高度以保持长宽比
image = image.resize((new_width, new_height))

定义字符集

要将图片转换为 ASCII 艺术,需要定义一个字符集,即一组字符,用于代表不同的灰度值。可以使用下面的字符集:

CHARS = [' ', '.', ':', '-', '=', '+', '*', '#', '%', '@']

将像素转换为字符

现在,可以将图片中的每个像素转换为一个字符。为了实现这一功能,可以遍历图片中的每个像素,并将其转换为一个灰度值。然后,将灰度值映射到字符集中的索引,使用相应的字符代替原始像素值。最后,将所有字符拼接在一起,以创建 ASCII 艺术。

# 将每个像素转换为字符,并拼接为字符串
ascii_art = ''
pixels = list(image.getdata())
for i in range(len(pixels)):
    pixel = pixels[i]
    gray = int((pixel[0] + pixel[1] + pixel[2]) / 3)  # 计算灰度值
    index = int(gray / (255 / (len(CHARS) - 1)))  # 映射到字符集中的索引
    ascii_art += CHARS[index]

    if (i + 1) % new_width == 0:
        ascii_art += '\n'  # 每行结束后换行

输出 ASCII 艺术

最后,将 ASCII 艺术输出到控制台:

# 输出 ASCII 艺术
print(ascii_art)

运行代码后,将会在控制台中看到生成的 ASCII 艺术。

完整代码

下面是完整的 Python 代码,用于将图片转换为 ASCII 艺术:

from PIL import Image

# 加载 PNG 图像
image = Image.open("qrcode.png").convert('RGB')

# 调整图像大小
width, height = image.size
aspect_ratio = height / width
new_width = 50
new_height = int(new_width * aspect_ratio * 0.55)  # 调整高度以保持长宽比
image = image.resize((new_width, new_height))

# 定义字符集
CHARS = [' ', '.', ':', '-', '=', '+', '*', '#', '%', '@']

# 将每个像素转换为字符,并拼接为字符串
ascii_art = ''
pixels = list(image.getdata())
for i in range(len(pixels)):
    pixel = pixels[i]
    gray = int((pixel[0] + pixel[1] + pixel[2]) / 3)  # 计算灰度值
    index = int(gray / (255 / (len(CHARS) - 1)))  # 映射到字符集中的索引
    ascii_art += CHARS[index]

    if (i + 1) % new_width == 0:
        ascii_art += '\n'  # 每行结束后换行

# 输出 ASCII 艺术到控制台
print(ascii_art)

如果喜欢请三连,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模第一天:数学建模先导课之MATLAB的入门

目录 一、MATLAB的简介 二、Matlab基础知识 1. 变量 ①命名规则 ②特殊变量名 2、数学符号与函数调用 ①符号 ②数学函数 ③自定义函数 三、数组与矩阵 1、数组 ①创建数组 ②访问数组元素 ③数组运算 2、矩阵 ①定义 ②特殊矩阵 ③矩阵运算 四、控制流 …

若依项目springcloud启动

若依项目springcloud启动 参考:http://doc.ruoyi.vip/ruoyi-cloud/document/hjbs.html 1、概述 1.1、学习前提 熟练使用springboot相关技术了解springcloud相关技术电脑配置可以支持 1.2、需要的配置 JDK > 1.8 (推荐1.8版本) Mysql > 5.7.0 (推荐5.7版…

若依数据隔离 ${params.dataScope} 替换 优化为sql 替换

若依数据隔离 ${params.dataScope} 替换 优化为sql 替换 安全问题:有风险的SQL查询:MyBatis解决 若依框架的数据隔离是通过 ${params.dataScope} 实现的 但是在代码安全扫描的时候$ 符会提示有风险的SQL查询:MyBatis 所以我们这里需要进行优化参考: M…

凌恩生物文献分享|IF31.316→一网打尽与婴儿疾病相关的病毒组研究

期刊:Cell Host & Microbe 影响因子:31.316 发表时间:2022年4月 研究团队:清华大学医学院梁冠翔课题组与宾夕法尼亚大学医学院Frederic Bushman课题组 一、研究背景 已知微生物为人类提供营养物质和代谢物&…

AD、PADS、Cadence各有什么优势?

读者中有很大一部分是电子工程师,先想问下大家:你们画PCB常用什么软件? **函第一的AD? 还是最贵Cadence(Allegro)? 看到有读者在问:AD、PADS、Cadence各有什么优势? 这里就简单分…

一文吃透Java线程池——实现机制篇

前言 本篇博客是《一文吃透Java线程池》系列博客的下半部分。 上半部分链接:一文吃透Java线程池——基础篇 实现机制(源码解析) 根据前面的学习,我们知道,线程池是如下的运作机制 解析: 一开始&#…

Flutter插件开发-(进阶篇)

一、概述 Flutter也有自己的Dart Packages仓库。插件的开发和复用能够提高开发效率,降低工程的耦合度,像网络请求(http)、用户授权(permission_handler)等客户端开发常用的功能模块,我们只需要引入对应插件就可以为项目快速集成相关能力&…

2023-04-15 学习记录--C/C++-mac vscode配置并运行C/C++

mac vscode配置并运行C/C 一、vscode安装 ⭐️ 去官网下载安装mac版的vscode。 二、vscode配置 ⭐️ (一)、安装C/C扩展插件及必装好用插件 1、点击左边的 图标(扩展: 商店),如下图: 2、先安装 C/C、C/CExtension Pack插件&…

大话数据结构-C(2)

二:算法 解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 2.1 算法的特性 算法具有五个基本特性:输入、输出、有穷性、确定性、可行性。 1)输入输出: 算法具…

Python --- 文件操作

目录 前言 一、open()函数 1.只读模式 r 2.只写模式 w 3.追加模式 a 二、操作其他文件 1.Python 操作二进制 2.Python 操作 json 文件 三、关闭文件 四、上下文管理器 五、文件指针位置 前言 在实际操作中,通常需要将数据写入到本地文件或者从本地文件中…

南方猛将加盟西方手机完全是臆测,他不会希望落得兔死狗烹的结局

早前南方某科技企业因为命名的问题闹得沸沸扬扬,于是一些业界人士就猜测该猛将会加盟西方手机,对于这种猜测可以嗤之以鼻,从西方手机以往的作风就可以看出来它向来缺乏容纳猛将的气量。一、没有猛将的西方手机迅速沉沦曾几何时,西…

【项目】bxg基于SaaS的餐掌柜项目实战(2023)

基于SaaS的餐掌柜项目实战 餐掌柜是一款基于SaaS思想打造的餐饮系统,采用分布式系统架构进行多服务研发,共包含4个子系统,分别为平台运营端、管家端(门店)、收银端、小程序端,为餐饮商家打造一站式餐饮服务…

如何用ChatGPT翻译?ChatGPT提升翻译速度,亲测有效

作为翻译新手,你是否为翻译不准确不地道而烦恼? 随着ChatGPT的大火,很多聪明的翻译已经开始使用ChatGPT辅助自己提升翻译能力和速度了。 想用ChatGPT翻译,首先要知道在哪里可以使用ChatGPT!在国内选择不用注册不用登录…

python实现批量生成带内容的文件夹

我工作的时候经常遇到这个问题:需要批量生成带内容的文件夹来辅助工作。 我有8种不同名字的文件夹 每个文件夹下面都有以日期命名的文件夹 日期文件夹里面会记录我当天需要记录的东西。 我需要实现的功能是: 1.输入一个天数N,生成N天以前…

机器学习 day05(多元线性回归,向量化)

单个特征(变量)的线性回归模型 房子的价格仅由房子的大小决定,如图: 多个特征(变量)的线性回归模型 房子的价格由房子的大小,房子有多少个卧室,房子有几层,房子住了多…

代码随想录|day44|动态规划part06● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包 理论基础 视频:带你学透完全背包问题! 和 01背包有什么差别?遍历顺序上有什么讲究?_哔哩哔哩_bilibili 链接:代码随想录 //先遍历背包还是先遍历物品是没有影响的。可以和01背包保持一致,都先遍历…

vue-自定义指令

需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。 需求2:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。 语法: 局部使用&#xff…

【硬件外设使用】——I2C

【硬件外设使用】——I2CI2C基本概念I2C通信协议I2C使用方法pyb.i2cmachine.i2cI2C可用的传感器I2C基本概念 I2C是"Inter-Integrated Circuit"的缩写,也被称为TWI (Two Wire Interface)。 它是一种串行通信协议,用于连接多个设备或组件。 I2…

记一次idea+Dockerfile+docker部署

软件版本:idea:2021.3,docker:19.03.9,服务器:centos7.8 1.centos7服务器配置 在服务器上编辑docker文件 vi /usr/lib/systemd/system/docker.service修改以ExecStart开头的行 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/ru…

计算机视觉基础__图像特征

计算机视觉基础__图像特征 本篇目录: 一、前言 二、位图和矢量图概念 三、图像的颜色特征 四、RGB 颜色空间 五、HSV 颜色空间 六、HLS 颜色空间 七、实例代码 八、参考资料 一、前言 传统图像处理,需要找出图片中的关键特征,然后对这…