找回密码
 加入天云!
搜索
查看: 102|回复: 4

炫酷的ASCII字符画

[复制链接]

66

主题

103

回帖

1058

积分

中级会员

积分
1058
Elan 发表于 2025-4-5 22:42:18 | 显示全部楼层 |阅读模式
本文由作者本人转载至天云论坛


先来看看成品

放大看就知道这是由一个个字符组成的“图片”


如何通过python快速生成呢?

  1. from PIL import Image
  2. import tkinter as tk
  3. from tkinter import filedialog

  4. chars = ['▮', '▯', '.']


  5. def resize_image(image, target_width=100):
  6.     width, height = image.size
  7.     aspect_ratio = height / width
  8.     target_height = int(target_width * aspect_ratio * 0.66)
  9.     return image.resize((target_width, target_height))


  10. def convert_to_gray(image):
  11.     return image.convert('L')


  12. def get_pixels(image):
  13.     return image.getdata()


  14. def pixels_to_chars(pixels):
  15.     return ''.join(chars[pixel_value // 100] for pixel_value in pixels)


  16. def main(image_path):
  17.     image = Image.open(image_path)
  18.     resized_image = resize_image(image)
  19.     gray_image = convert_to_gray(resized_image)
  20.     pixels = get_pixels(gray_image)
  21.     ascii_art = pixels_to_chars(pixels)

  22.     # 分割并打印ASCII艺术
  23.     ascii_lines = [ascii_art[i:i + 100] for i in range(0, len(ascii_art), 100)]
  24.     for line in ascii_lines:
  25.         print(line)


  26. if __name__ == '__main__':
  27.     root = tk.Tk()
  28.     root.withdraw()  # 隐藏主窗口
  29.     file_path = filedialog.askopenfilename()
  30.     if file_path:
  31.         main(file_path)
复制代码
解析功能介绍
1.导入库:
PIL (Python Imaging Library): 用于图像处理。
tkinter: Python的标准GUI库,用于创建简单的图形用户界面。


2.定义字符集:
chars 是一个包含三个字符的列表,这些字符将用于表示图片的不同灰度级别。


3.函数功能:
resize_image: 调整图片的大小,使其宽度为100像素,并保持其原始的宽高比。
convert_to_gray: 将图片转换为灰度图像
get_pixels: 获取灰度图像的像素数据。
pixels_to_chars: 将像素值转换为对应的字符。这里假设每个像素值的范围是0-255,因此通过pixel_value // 100可以将像素值大致分为3个区间,每个区间对应一个字符。
main: 主函数,负责读取图片、调整大小、转换为灰度、获取像素、转换为字符,并打印出来。


4.GUI部分:
使用tkinter库创建一个简单的文件选择对话框,允许用户选择一个图片文件。


5.运行:
当运行脚本时,它会弹出一个文件选择对话框,让用户选择一个图片文件。
选择文件后,它会读取文件,进行上述处理,并将结果以ASCII艺术的形式打印到控制台。

<!--这里只大概分为三个区间,有需要更层次分明的形式可以添加区间-->

这样,一个简单的ASCII艺术生成器,可以将普通的图片转换为字符表示的生成器就完成了(成果如前面所示)。
基于这个改编,我借助了一点点,真的就一点点(¬︿̫̿¬☆)Ai的力量把它改写成了网页:
使用surge部署了:
https://asciipic.surge.sh/
如果你有兴趣可以自行下载它的源码,这里就不占用论坛资源了。整体使用js来处理,但是代码真的很烂。。
在输出区因为宽度原因可能无法正常显示,可以复制到记事本里。
实地应用的话,,,大概就是美化吧。
在我的道法历史网上也有半自动化部署的应用:
因为surge静态的限制,之前我只能每天重新制作网页并且上传,现在有了surge+note.ms+ASCII(主要是为了更清晰的展现),就可以实现一次上传,长久运行。
怎么样?至少看着还不错吧doge

回复

使用道具 举报

21

主题

128

回帖

683

积分

中级会员

积分
683
Makotowa 发表于 2025-4-6 10:19:10 | 显示全部楼层
赞!

大多数输出需要反色才会有较好的观感,希望调整

一个效果良好的测试样例:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入天云!

×
回复

使用道具 举报

21

主题

128

回帖

683

积分

中级会员

积分
683
Makotowa 发表于 2025-4-6 10:41:26 | 显示全部楼层
Makotowa 发表于 2025-4-6 10:19
赞!

大多数输出需要反色才会有较好的观感,希望调整

我将网页脚本
  1. const chars = ['▮', '▯', '▯'];
复制代码
修改为
  1. const chars = ['░', '▒', '▒'];
复制代码
效果较好,如图:








原本打算使用深阴影,但是字符宽度不一致,遂放弃
话说使用这种字符生成还能叫ASCII字符画吗(

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入天云!

×
回复

使用道具 举报

66

主题

103

回帖

1058

积分

中级会员

积分
1058
 楼主| Elan 发表于 2025-4-6 14:23:10 | 显示全部楼层
Makotowa 发表于 2025-4-6 10:41
我将网页脚本
修改为
效果较好,如图:

效果很棒!

赞b( ̄▽ ̄)d

只不过这确实好像不是ASCII字符的画,不过问题不大,就当它是个固定短语罢doge
回复

使用道具 举报

66

主题

103

回帖

1058

积分

中级会员

积分
1058
 楼主| Elan 发表于 2025-4-6 14:30:46 | 显示全部楼层
Makotowa 发表于 2025-4-6 10:41
我将网页脚本
修改为
效果较好,如图:

谢谢!我在网页上更新了您提供的的样式
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入天云!

本版积分规则

Archiver|小黑屋|萌ICP备20250701号|天云社区

GMT+8, 2025-4-27 01:48 , Processed in 0.094285 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表