当前位置: 首页 > news >正文

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 输出
http://www.xdnf.cn/news/760573.html

相关文章:

  • 【Hexo】4.Hexo 博客文章进行加密
  • python汉语编程,将关键字与文言文对应
  • Claude 4 升级:从问答助手到任务执行者 | AI大咖说
  • Python入门手册:类和对象
  • Spring是如何实现属性占位符解析
  • 如何下载python的第三方类库
  • Day 36训练
  • Linux epel-release 详解
  • 多线程——定时任务ScheduledThreadPoolExecutor用法
  • 深度学习---负样本训练
  • 字符串相关的方法有哪些?
  • 基于LLM的智能客服系统开发全流程:技术架构、落地挑战与行业实践
  • 智能体觉醒:AI开始自己“动手”了-自主进化开启任务革命时代
  • 【强化学习哲学 Day 1】Q-Learning - 在不确定中寻找确定
  • ​​技术深度解析:《鸿蒙5.0+:AI驱动的全场景功耗革命》​
  • 智慧交通设计方案
  • Docker安装mitproxy
  • Vue组件定义
  • 中国高分辨率高质量地面CO数据集(2013-2023)
  • C++:回调函数
  • duilib图片属性中corner属性九宫格拉伸说明
  • DQN和DDQN(进阶版)
  • 跨平台猫咪桌宠 BongoCat v0.4.0 绿色版
  • AdaCtrl:自适应可控Reasoning,可降10~90%推理长度!!
  • 模拟实现线程池(线程数目为定值)和定时器
  • 告别手动绘图!基于AI的Smart Mermaid自动可视化图表工具搭建与使用指南
  • 【python深度学习】Day 42 Grad-CAM与Hook函数
  • [学习] PID算法原理与实践(代码示例)
  • 高速串行接口
  • ESG体系