Python实例题:Python3实现图片转彩色字符
目录
Python实例题
题目
代码实现
实现原理
图像预处理:
灰度值计算:
字符映射:
彩色输出:
关键代码解析
1. 字符映射和灰度计算
2. 图像模式输出
3. 命令行参数处理
使用说明
基本用法(终端输出):
保存为图像文件:
调整字符画大小:
自定义字符集:
查看完整帮助:
扩展建议
增强功能:
性能优化:
用户界面:
输出格式:
Python实例题
题目
Python3实现图片转彩色字符
代码实现
import argparse
import os
from PIL import Image, ImageDraw, ImageFont
import sys
import termcolor
import platformclass ImageToColorAscii:def __init__(self, width=80, height=40, charset=" .:-=+*#%@", bg_color=(0, 0, 0), fill_color=(255, 255, 255),output_mode="terminal"):"""初始化图片转彩色字符画转换器Args:width: 输出字符画的宽度height: 输出字符画的高度charset: 用于绘制的字符集,按从暗到亮的顺序排列bg_color: 背景颜色,默认为黑色fill_color: 填充颜色,默认为白色output_mode: 输出模式,可选"terminal"或"image""""self.width = widthself.height = heightself.charset = charsetself.bg_color = bg_colorself.fill_color = fill_colorself.output_mode = output_modeself.terminal_support_color = self._check_terminal_color_support()def _check_terminal_color_support(self):"""检查终端是否支持彩色输出"""if platform.system() == 'Windows':return False # Windows终端默认不支持ANSI颜色return Truedef convert(self, image_path, output_path=None):"""将图片转换为彩色字符画Args:image_path: 输入图片路径output_path: 输出文件路径,默认为None(直接打印到终端)Returns:转换后的字符画字符串或生成的图片路径"""try:# 打开并调整图片大小with Image.open(image_path) as img:img = img.resize((self.width, self.height), Image.LANCZOS)# 转换为RGB模式img = img.convert("RGB")# 生成字符画if self.output_mode == "terminal":return self._convert_to_terminal(img)else:return self._convert_to_image(img, output_path)except Exception as e:print(f"转换失败: {e}")return Nonedef _convert_to_terminal(self, img):"""将图片转换为终端彩色字符画Args:img: PIL Image对象Returns:彩色字符画字符串"""ascii_art = []for y in range(self.height):line = []for x in range(self.width):r, g, b = img.getpixel((x, y))# 计算灰度值gray = int(0.299 * r + 0.587 * g + 0.114 * b)# 根据灰度值选择字符char_index = min(int(gray * len(self.charset) / 256), len(self.charset) - 1)char = self.charset[char_index]# 添加彩色字符if self.terminal_support_color:colored_char = termcolor.colored(char, color=None, on_color=None, attrs=None)line.append(colored_char)else:line.append(char)ascii_art.append(''.join(line))return '\n'.join(ascii_art)def _convert_to_image(self, img, output_path=None):"""将图片转换为图像格式的彩色字符画Args:img: PIL Image对象output_path: 输出图片路径Returns:输出图片路径"""# 创建新图像char_width = 10char_height = 18output_img = Image.new('RGB', (self.width * char_width, self.height * char_height), self.bg_color)draw = ImageDraw.Draw(output_img)# 尝试加载中文字体try:font = ImageFont.truetype("simhei.ttf", 14)except IOError:# 使用默认字体font = ImageFont.load_default()for y in range(self.height):for x in range(self.width):r, g, b = img.getpixel((x, y))# 计算灰度值gray = int(0.299 * r + 0.587 * g + 0.114 * b)# 根据灰度值选择字符char_index = min(int(gray * len(self.charset) / 256), len(self.charset) - 1)char = self.charset[char_index]# 绘制字符draw.text((x * char_width, y * char_height), char, font=font, fill=(r, g, b))# 保存图像if not output_path:base, ext = os.path.splitext(os.path.basename(image_path))output_path = f"{base}_ascii.png"output_img.save(output_path)return output_pathdef main():parser = argparse.ArgumentParser(description='图片转彩色字符画工具')parser.add_argument('-i', '--input', required=True, help='输入图片路径')parser.add_argument('-o', '--output', help='输出文件路径,默认为终端或原文件名加_ascii后缀')parser.add_argument('--width', type=int, default=80, help='输出宽度,默认为80')parser.add_argument('--height', type=int, default=40, help='输出高度,默认为40')parser.add_argument('--charset', default=" .:-=+*#%@", help='字符集,按从暗到亮的顺序排列')parser.add_argument('--bg-color', default="0,0,0", help='背景颜色,RGB值,用逗号分隔')parser.add_argument('--fill-color', default="255,255,255", help='填充颜色,RGB值,用逗号分隔')parser.add_argument('--mode', choices=['terminal', 'image'], default='terminal', help='输出模式,可选terminal或image')args = parser.parse_args()# 解析颜色参数bg_color = tuple(map(int, args.bg_color.split(',')))fill_color = tuple(map(int, args.fill_color.split(',')))# 创建转换器converter = ImageToColorAscii(width=args.width,height=args.height,charset=args.charset,bg_color=bg_color,fill_color=fill_color,output_mode=args.mode)# 执行转换result = converter.convert(args.input, args.output)if result:if args.mode == 'terminal':print(result)print(f"\n字符画宽度: {args.width}, 高度: {args.height}")else:print(f"彩色字符画已保存到: {result}")else:print("转换失败")if __name__ == "__main__":main()
实现原理
这个图片转彩色字符画工具基于以下核心技术实现:
-
图像预处理:
- 调整图片大小以适应字符画输出
- 转换为 RGB 模式以便获取每个像素的颜色值
-
灰度值计算:
- 使用加权平均法计算 RGB 像素的灰度值
- 公式:
gray = 0.299*R + 0.587*G + 0.114*B
-
字符映射:
- 根据灰度值选择合适的字符
- 使用从暗到亮的字符集进行映射
-
彩色输出:
- 终端模式:使用 ANSI 转义序列输出彩色字符
- 图像模式:创建新图像并在每个位置绘制对应字符
关键代码解析
1. 字符映射和灰度计算
def _convert_to_terminal(self, img):ascii_art = []for y in range(self.height):line = []for x in range(self.width):r, g, b = img.getpixel((x, y))# 计算灰度值gray = int(0.299 * r + 0.587 * g + 0.114 * b)# 根据灰度值选择字符char_index = min(int(gray * len(self.charset) / 256), len(self.charset) - 1)char = self.charset[char_index]# 添加彩色字符if self.terminal_support_color:colored_char = termcolor.colored(char, color=None, on_color=None, attrs=None)line.append(colored_char)else:line.append(char)ascii_art.append(''.join(line))return '\n'.join(ascii_art)
2. 图像模式输出
def _convert_to_image(self, img, output_path=None):char_width = 10char_height = 18output_img = Image.new('RGB', (self.width * char_width, self.height * char_height), self.bg_color)draw = ImageDraw.Draw(output_img)# 尝试加载中文字体try:font = ImageFont.truetype("simhei.ttf", 14)except IOError:font = ImageFont.load_default()for y in range(self.height):for x in range(self.width):r, g, b = img.getpixel((x, y))gray = int(0.299 * r + 0.587 * g + 0.114 * b)char_index = min(int(gray * len(self.charset) / 256), len(self.charset) - 1)char = self.charset[char_index]# 绘制字符,使用原始RGB颜色draw.text((x * char_width, y * char_height), char, font=font, fill=(r, g, b))# 保存图像if not output_path:base, ext = os.path.splitext(os.path.basename(image_path))output_path = f"{base}_ascii.png"output_img.save(output_path)return output_path
3. 命令行参数处理
def main():parser = argparse.ArgumentParser(description='图片转彩色字符画工具')parser.add_argument('-i', '--input', required=True, help='输入图片路径')parser.add_argument('-o', '--output', help='输出文件路径')parser.add_argument('--width', type=int, default=80, help='输出宽度')parser.add_argument('--height', type=int, default=40, help='输出高度')parser.add_argument('--charset', default=" .:-=+*#%@", help='字符集')parser.add_argument('--bg-color', default="0,0,0", help='背景颜色')parser.add_argument('--fill-color', default="255,255,255", help='填充颜色')parser.add_argument('--mode', choices=['terminal', 'image'], default='terminal', help='输出模式')args = parser.parse_args()# 解析颜色参数bg_color = tuple(map(int, args.bg_color.split(',')))fill_color = tuple(map(int, args.fill_color.split(',')))# 创建转换器并执行转换converter = ImageToColorAscii(width=args.width,height=args.height,charset=args.charset,bg_color=bg_color,fill_color=fill_color,output_mode=args.mode)result = converter.convert(args.input, args.output)if result:if args.mode == 'terminal':print(result)else:print(f"彩色字符画已保存到: {result}")
使用说明
-
基本用法(终端输出):
python image_to_color_ascii.py -i input.jpg
-
保存为图像文件:
python image_to_color_ascii.py -i input.jpg -o output.png --mode image
-
调整字符画大小:
python image_to_color_ascii.py -i input.jpg --width 120 --height 60
-
自定义字符集:
python image_to_color_ascii.py -i input.jpg --charset " .:;+=xX$#@"
-
查看完整帮助:
python image_to_color_ascii.py --help
扩展建议
-
增强功能:
- 添加对动图的支持
- 实现不同的字符渲染算法
- 添加艺术滤镜效果
- 支持视频转字符动画
-
性能优化:
- 使用 NumPy 加速图像处理
- 优化字符选择算法
- 实现多线程处理
-
用户界面:
- 开发图形界面版本
- 添加实时预览功能
- 支持交互式调整参数
-
输出格式:
- 支持导出为 HTML、SVG 等格式
- 添加对不同字体的支持
- 实现彩色 PDF 输出
相关文章:
Python实例题:Python3实现图片转彩色字符
目录 Python实例题 题目 代码实现 实现原理 图像预处理: 灰度值计算: 字符映射: 彩色输出: 关键代码解析 1. 字符映射和灰度计算 2. 图像模式输出 3. 命令行参数处理 使用说明 基本用法(终端输出&#x…...
同一机器下通过HTTP域名访问其他服务器进程返回504问题记录
我这边项目的服务器有好几个类型节点,每个节点为一个进程,不同节点间通过HTTP来通讯,当前这几个类型的节点都部署在同一台机器上,然后我再测试某个节点到另一个节点的http通讯时,发现一个奇怪的现象: 1. 我…...

基于物联网(IoT)的电动汽车(EVs)智能诊断
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从&#x…...

JDBC+HTML+AJAX实现登陆和单表的CRUD
JDBCHTMLAJAX实现登陆和单表的CRUD 导入maven依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio…...
Leetcode 3568. Minimum Moves to Clean the Classroom
Leetcode 3568. Minimum Moves to Clean the Classroom 1. 解题思路2. 代码实现 题目链接:3568. Minimum Moves to Clean the Classroom 1. 解题思路 这一题我的核心思路就是广度优先遍历遍历剪枝。 显然,我们可以给出一个广度优先遍历来给出所有可能…...
Kafka多线程Consumer
Apache Kafka作为一款分布式流处理平台,以其高吞吐量和可扩展性在大数据处理领域占据了重要地位。在实际应用中,为了提升数据处理的效率和灵活性,我们常常需要采用多线程的方式来消费Kafka中的数据。本文将通过一个案例分析,详细探…...
从零开始的git学习
基本概念:修改记录 1、每个修改记录都有对应的id 2、当发现修改有问题时,可以进行回滚操作。 3、回滚的本质是一次新的更新以复原修改。但是如果不是针对最新记录进行回滚,会出现冲突。 这里需要举例说明 基本概念:分支 1、分支…...

【C++】位图详解(一文彻底搞懂位图的使用方法与底层原理)
🌈 个人主页:谁在夜里看海. 🔥 个人专栏:《C系列》《Linux系列》 ⛰️ 天高地阔,欲往观之。 目录 1.位图的概念 2.位图的使用方法 定义与创建 设置和清除 位访问和检查 转换为其他格式 3.位图的使用场景 1.快速…...
Spring Boot 整合 JdbcTemplate,JdbcTemplate 与 MyBatis 的区别
DAY29.1 Java核心基础 Spring Boot 整合 JdbcTemplate JdbcTemplate是一个轻量级JDBC封装的组件 JdbcTemplate 是 Spring 自带的JDBC的封装,和Mybatis类似,需要自己封装sql语句 JdbcTemplate 帮助我们来连接数据库,SQL的执行,…...
sass基础语法
Sass(Syntactically Awesome Style Sheets)是一种 CSS 预处理器,提供了比原生 CSS 更强大、更灵活的语法功能。它有两种语法格式: Sass(缩进语法,.sass 文件)SCSS(CSS-like 语法&am…...
【EF Core】 EF Core 批量操作的进化之路——从传统变更跟踪到无跟踪更新
文章目录 前言一、批量操作(Rang)1.1 AddRange()1.2 UpdateRange()1.3 AttachRange()1.4 RemoveRange() 二、Range操作的底层优化2.1 EF Core 7 前举步维艰2.2 EF Core 7后焕然一新 三、无跟踪的批量更新与删除3.1 ExecuteUpdate3.2 ExecuteDelete3.3 状…...
[Go] Option选项设计模式 — — 编程方式基础入门
[Go] Option选项设计模式 — — 编程方式基础入门 全部代码地址,欢迎⭐️ Github:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-option 1 介绍 在 Go 开发中,我们经常遇到需要处理多参数配置的场景。传统方…...
Vue 项目命名规范指南
📚 Vue 项目命名规范指南(适用于 Vue 3 Pinia Vue Router) 目的:统一命名风格,提升可读性、可维护性和团队协作效率。 一、通用原则 类型命名风格示例变量camelCaseuserName, isLoading常量UPPER_SNAKE_CASEMAX_RET…...

【笔记】开源通用人工智能代理 Suna 部署全流程准备清单(Windows 系统)
#工作记录 一、基础工具与环境 开发工具 Git 或 GitHub Desktop(代码管理)Docker Desktop(需启用 WSL2,容器化部署)Python 3.11(推荐版本,需添加到系统环境变量)Node.js LTS…...

海康工业相机SDK二次开发(VS+QT+海康SDK+C++)
前言 工业相机在现代制造和工业自动化中扮演了至关重要的角色,尤其是在高精度、高速度检测中。海康威视工业相机以其性能稳定、图像质量高、兼容性强而受到广泛青睐。特别是搞机器视觉的小伙伴们跟海康打交道肯定不在少数,笔者在平常项目中跟海康相关人…...
前端面试准备-5
1.Node.js中的process.nectTick()有什么作用 将一个回调函数插入到当前执行栈的尾部,在下一次事件轮询之前调用这个回调函数 2.什么是Node.js中的事件发射器,作用是什么,如何使用 提供一种机制,可以创建、触发和监听自定义事件…...
Spring Boot 启动流程深度解析:从源码到实践
Spring Boot 启动流程深度解析:从源码到实践 Spring Boot 作为 Java 开发的主流框架,其 “约定大于配置” 的理念极大提升了开发效率。本文将从源码层面深入解析 Spring Boot 的启动流程,并通过代码示例展示其工作机制。 一、Spring Boot 启…...

深度学习|pytorch基本运算-乘除法和幂运算
【1】引言 前序学习进程中,已经对pytorch张量数据的生成和广播做了详细探究,文章链接为: 深度学习|pytorch基本运算-CSDN博客 深度学习|pytorch基本运算-广播失效-CSDN博客 上述探索的内容还止步于张量的加减法,在此基础上&am…...
嵌入式通用集成电路卡市场潜力报告:物联网浪潮下的机遇与挑战剖析
一、嵌入式通用集成电路卡概述 嵌入式通用集成电路卡(Embedded Universal Integrated Circuit Card,简称 eUICC),是一种将传统 SIM 卡功能直接嵌入到设备主板上的芯片解决方案 。与传统可插拔式 SIM 卡不同,eUICC 采…...

4.2.4 Spark SQL 数据写入模式
在本节实战中,我们详细探讨了Spark SQL中数据写入的四种模式:ErrorIfExists、Append、Overwrite和Ignore。通过具体案例,我们演示了如何使用mode()方法结合SaveMode枚举类来控制数据写入行为。我们首先读取了一个JSON文件生成DataFrame&#…...

论文笔记: Urban Region Embedding via Multi-View Contrastive Prediction
AAAI 2024 1 INTRO 之前基于多视图的region embedding工作大多遵循相同的模式 单独的单视图表示多视图融合 但这种方法存在明显的局限性:忽略了不同视图之间的信息一致性 一个区域的多个视图所携带的信息是高度相关的,因此它们的表示应该是一致的如果能…...
Android 缓存应用冻结器(Cached Apps Freezer)
一、核心功能与原理 1. 功能概述 目标:通过冻结后台缓存应用的进程,减少其对 CPU、内存等系统资源的消耗,优化设备性能与续航。适用场景:针对行为不当的后台应用(如后台偷偷运行代码、占用 CPU)ÿ…...

初学者如何微调大模型?从0到1详解
本文将手把手带你从0到1,详细解析初学者如何微调大模型,让你也能驾驭这些强大的AI工具。 1. 什么是大模型微调? 想象一下,预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识,但可能无法完美…...

西瓜书第十一章——降维与度量学习
文章目录 降维与度量学习k近邻学习原理头歌实战-numpy实现KNNsklearn实现KNN 降维——多维缩放(Multidimensional Scaling, MDS,MDS)提出背景与原理重述1.**提出背景**2.**数学建模与原理推导**3.**关键推导步骤** Principal Component Analy…...

Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家
背景 Portainer 是一个轻量级且功能强大的容器管理面板,专为 Docker 和 Kubernetes 环境设计。它通过直观的 Web 界面简化了容器的部署、管理和监控,即使是非技术用户也能轻松上手。Portainer 支持多节点管理,允许用户从一个中央控制台管理多…...
NanoGPT的BenchMarking.py
1.Benchmarking是一种评估和比较性能的过程。在深度学习领域,它通常涉及对模型的训练速度、推理速度、内存占用等指标进行测量,以便评估不同模型、不同硬件配置或者不同软件版本之间的性能差异。 例如,当你尝试比较两个不同架构的模型&#x…...
测试用例及黑盒测试方法
一、测试用例 1.1 基本要素 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等4个主要要素。 1.1.1 测试环境 定义:测试执行所需的软硬件…...
CentOS 7 环境下部署 LAMP
在 CentOS 7 环境下部署 LAMP(Linux Apache MySQL 5.7 PHP 7.4) 环境的详细步骤如下: 1. 系统准备 1.1 更新系统 sudo yum update -y 1.2 安装依赖 sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel e…...

vscode实用配置
前端开发安装插件: 1.可以更好看的显示文件图标 2.用户快速打开文件 使用步骤:在html文件下右键点击 open with live server 即可 刷力扣: 安装这个插件 还需要安装node.js即可...

React 项目中封装 Excel 导入导出组件:技术分享与实践
文章目录 前言一、为什么需要封装 Excel 组件?二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 (UploadExcel) 总结 前言 在 React 项目中,处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…...