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

字符画(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将图片转换为字符画。关键步骤包括:缩放图片、将图片灰度化、将灰度值映射为字符、最后将字符输出到文件。你可以根据自己的需要调整字符集、图片宽度和其他参数,生成属于自己的字符画!

相关文章

Python自动生成手绘、证件照、九宫格...太炫酷了

Python像是叮当猫的口袋,几乎什么都能做,适合外行小白们去摸索学习,能极大的增加对编程的兴趣。有些工具用python来实现不一定是技术上的最优选择,但可能是最简洁、最面向大众的。介绍几个不错的处理...

教你使用python编程绘制函数图像

函数公式很抽象,图像更直观,但聪明的我们总不会手画图像吧?来学习一下用Python怎么画函数图像吧。首先打开Visual Studio Code(后面简称VSCode),点击New File(中文版是...

新手必看!如何用Python绘制复杂函数图像

在数据可视化的奇妙世界里,Python 就像是一把万能钥匙,能够帮我们打开一扇扇通往复杂函数图像绘制的大门。今天,就跟着我一起来探索如何用 Python 绘制那些令人惊叹的复杂函数图像吧!对于数学爱好...

怎么做到的?用python制作九宫格图片,太棒了

1. ? 应用场景 ?当初的想法是:想把一张图切割成九等份,发布到微信朋友圈,切割出来的图片,上传到朋友圈,发现微信不按照我排列的序号来排版。这样的结果是很耗时间的。让我深思,能不能有一种,直接拼接成...

python调用 stable diffusion批量生成图片代码解析

文中大多数内容来源github,版权属于原作者,1. 基础环境在windows上做示例,本地要安装了pythonpython的pip模块 安装 webuiapi编辑器 pyCharm 2024.2(c...

python图像处理入门-提取轮廓

提取图像中物体的轮廓,通常用在图像识别中,比如图像像素级分割,应用面比较广。import cv2 import numpy as np from skimage.measure import fi...