百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

使用Python将图片转换为字符画并保存到文件

itomcoil 2025-05-24 14:41 1 浏览

字符画(ASCII Art)是将图片转换为由字符组成的艺术作品。利用Python,我们可以轻松实现图片转字符画的功能。本教程将带你一步步实现这个功能,并详细解释每一步的代码和实现原理。

环境准备

首先,你需要确保安装了以下库:

  • Pillow:用于处理图像的Python库。

你可以通过以下命令来安装Pillow库:

pip install pillow

步骤 1:导入必要的库

from PIL import Image
  • PIL.Image 是Pillow库中的图像处理模块,用于打开和处理图片。

步骤 2:定义字符集

在字符画中,使用的字符越密集,图片看起来越“黑”,字符越稀疏,图片看起来越“亮”。常用的字符集从低密度到高密度排列如下:

ASCII_CHARS = ["@", "#", "S", "%", "?", "*", "+", ";", ":", ",", "."]
  • 该字符集按从“最黑”到“最亮”的顺序排列。我们将用这些字符来替代图片中的像素值。

步骤 3:调整图片大小

为了方便处理和保证字符画的清晰度,我们需要对图片进行缩放。字符的宽高比不同于像素,因此缩放时要保持正确的比例。

def resize_image(image, new_width=100):
    width, height = image.size
    aspect_ratio = height / width / 1.65  # 1.65 是字符的宽高比调整因子
    new_height = int(aspect_ratio * new_width)
    resized_image = image.resize((new_width, new_height))
    return resized_image
  • new_width:我们将图片缩放到固定宽度(默认100个字符宽度)。
  • aspect_ratio:保持图片的纵横比,1.65为经验数值,用于调整字符的宽高比例。
  • image.resize():利用Pillow库的resize方法缩放图片。

步骤 4:将图片转换为灰度图

字符画只关心亮度信息,因此我们需要将图片转换为灰度图。

def grayify(image):
    return image.convert("L")
  • convert("L"):将图片从RGB模式转换为灰度模式,L表示亮度通道。

步骤 5:将每个像素映射为字符

根据像素的灰度值,将其映射为对应的字符。灰度值范围是0(黑)到255(白),我们需要根据灰度值选择字符集中的字符。

def pixels_to_ascii(image):
    pixels = image.getdata()  # 获取图像中所有像素值的列表
    ascii_str = ""
    for pixel in pixels:
        ascii_str += ASCII_CHARS[pixel // 25]  # 将灰度值缩小到字符集的范围
    return ascii_str
  • image.getdata():返回图片的像素值列表。
  • pixel // 25:将灰度值分段(每25个灰度级别对应一个字符),因为我们有11个字符(255/11≈25)。

步骤 6:格式化字符画输出

生成的字符是一行一行的,但我们需要按图像的宽度对字符进行换行。

def format_ascii(ascii_str, width):
    ascii_str_len = len(ascii_str)
    ascii_img = ""
    for i in range(0, ascii_str_len, width):
        ascii_img += ascii_str[i:i + width] + "\n"
    return ascii_img
  • width:图片缩放后的宽度。通过每width个字符进行一次换行,使字符画保持图片的宽度比例。

步骤 7:将字符画写入文件

def image_to_ascii(image_path, width=100, output_file="output.txt"):
    try:
        # 打开图片
        image = Image.open(image_path)
    except Exception as e:
        print(f"无法打开图片文件:{e}")
        return

    # 图片处理:调整大小、灰度转换、字符映射
    image = resize_image(image, width)
    image = grayify(image)

    ascii_str = pixels_to_ascii(image)
    ascii_img = format_ascii(ascii_str, width)

    # 将字符画写入文件
    with open(output_file, "w") as f:
        f.write(ascii_img)

    print(f"字符画已保存到文件 {output_file}")

步骤 8:运行程序

你可以通过以下方式运行整个流程,生成字符画:

image_to_ascii("path_to_your_image.jpg", width=100, output_file="output.txt")

将 path_to_your_image.jpg 替换为你图片的路径,程序会输出对应的字符画到output.txt文件中,你可以用文本编辑器打开该文件查看字符画效果。

完整代码示例

from PIL import Image

ASCII_CHARS = ["@", "#", "S", "%", "?", "*", "+", ";", ":", ",", "."]

def resize_image(image, new_width=100):
    width, height = image.size
    aspect_ratio = height / width / 1.65
    new_height = int(aspect_ratio * new_width)
    resized_image = image.resize((new_width, new_height))
    return resized_image

def grayify(image):
    return image.convert("L")

def pixels_to_ascii(image):
    pixels = image.getdata()
    ascii_str = ""
    for pixel in pixels:
        ascii_str += ASCII_CHARS[pixel // 25]
    return ascii_str

def format_ascii(ascii_str, width):
    ascii_str_len = len(ascii_str)
    ascii_img = ""
    for i in range(0, ascii_str_len, width):
        ascii_img += ascii_str[i:i + width] + "\n"
    return ascii_img

def image_to_ascii(image_path, width=100, output_file="output.txt"):
    try:
        # 打开图片
        image = Image.open(image_path)
    except Exception as e:
        print(f"无法打开图片文件:{e}")
        return

    # 图片处理:调整大小、灰度转换、字符映射
    image = resize_image(image, width)
    image = grayify(image)

    ascii_str = pixels_to_ascii(image)
    ascii_img = format_ascii(ascii_str, width)

    # 将字符画写入文件
    with open(output_file, "w") as f:
        f.write(ascii_img)

    print(f"字符画已保存到文件 {output_file}")


# 示例调用
image_to_ascii("29h05hdy58.jpg", 600, output_file="output.txt")

总结

通过这篇教程,我们了解了如何使用Python将图片转换为字符画。关键步骤包括:缩放图片、将图片灰度化、将灰度值映射为字符、最后将字符输出到文件。你可以根据自己的需要调整字符集、图片宽度和其他参数,生成属于自己的字符画!

相关推荐

点过的网页会变色?没错,这玩意把你的浏览记录漏光了

提起隐私泄露这事儿,托尼其实早就麻了。。。平时网购、换手机号、注册各种账号之类的都会咔咔泄露,根本就防不住。但托尼真是没想到,浏览器里会有一个看起来完全人畜无害的功能,也在偷偷泄露我们的个人隐私,而且...

Axure教程:高保真数据可视化原型

本文将介绍如何制作Axure高保真数据可视化原型,供大家参考和学习。高保真数据可视化原型设计,称得上是Axure高阶水平。数据可视化在原型设计中是一个重要的分支,但是对于Axure使用者具有一定要求。...

Flutter web开发中禁用浏览器后退按钮

路由采用的go-router路由框架:finalrootNavigatorKey=GlobalKey<NavigatorState>();finalGoRouterrouter...

jQuery 控制属性和样式

标记的属性each()遍历元素:each(callback)方法主要用于对选择器进行遍历,它接受一个函数为参数,该函数接受一个参数,指代元素的序号。对于标记的属性而言,可以利用each()方法配合th...

微信小程序入门教程之二:页面样式

这个系列的上一篇教程,教大家写了一个最简单的Helloworld微信小程序。但是,那只是一个裸页面,并不好看。今天接着往下讲,如何为这个页面添加样式,使它看上去更美观,教大家写出实际可以使用的页...

如何在Windows11的任务栏中禁用和删除天气小部件图标?

微软该公司已在Windows11的任务栏中添加了一个天气小部件图标,作为小部件的入口点。这个功能与之前Win10上的新闻与资讯功能相同,但是有的用户不喜欢想要关闭,不知道如何操作,下面小编为大家带来...

CSS伪类选择器大全:提升网页交互与样式的神奇工具

CSS伪类选择器是前端开发中不可或缺的强大工具,它们允许我们根据元素的状态、位置或用户行为动态地应用样式。本文将全面介绍常用的伪类选择器,并通过代码示例展示其实际应用场景。一、基础交互伪类1.超链接...

7个Axure使用小技巧

编辑导读:对于Axure原型工具,很少有产品经过系统学习,一般都是直接上手,边摸索边学习,这直接导致很多快捷操作被忽视。笔者在日常工作中总结出以下小技巧,希望对各位有帮助。之前整理了2期Axure的...

JavaScript黑暗技巧:禁止浏览器点击“后退”按钮

浏览网页时,当从A页面点击跳转到B页面后,一般情况下,可以点击浏览器上的“后退”按钮返回A页面。如果进入B页面后,B页面想让访问者留下,禁止返回,是否可以实现呢?这简直是要控制浏览器的行为,虽然有些邪...

对齐PyTorch,一文详解OneFlow的DataLoader实现

撰文|赵露阳在最新的OneFlowv0.5.0版本中,我们增加了许多新特性,比如:新增动态图特性:OneFlow默认以动态图模式(eager)运行,与静态图模式(graph)相比,更容易搭建网...

Python计算机视觉编程 第一章 基本的图像操作和处理

以下是使用Python进行基本图像操作和处理的示例代码:使用PIL库加载图像:fromPILimportImageimage=Image.open("image.jpg"...

PyTorch 深度学习实战(31):可解释性AI与特征可视化

在上一篇文章中,我们探讨了模型压缩与量化部署技术。本文将深入可解释性AI与特征可视化领域,揭示深度学习模型的决策机制,帮助开发者理解和解释模型的内部工作原理。一、可解释性AI基础1.核心概念特征重要...

学习编程第177天 python编程 富文本框text控件的使用

今天学习的是刘金玉老师零基础Python教程第72期,主要内容是python编程富文本框text控件。一、知识点1.tag_config方法:利用某个别名作为标签,具体的对应标签的属性功能配置在后面参...

用Python讓電腦攝像頭實現掃二維碼

importsys#系統模組,用來存取命令列參數與系統功能importcv2#OpenCV,處理影像與相機操作importnumpyasnp#Numpy,用來處理數值與...

使用Transformer来做物体检测

作者:JacobBriones编译:ronghuaiyang导读这是一个Facebook的目标检测Transformer(DETR)的完整指南。介绍DEtectionTRansformer(D...