近期 1200 万粉丝博主 “何同学” 陷入抄袭风波,被指向的抄袭项目是 ASCII-generator[1],issue 下面吵的热火朝天,感兴趣可以自己去看看,网上已经有很多博主在介绍了,下面让我们看看这个项目是干嘛用的!
ASCII-generator 是一个用 Python 实现的 ASCII 生成器工具,通过以下功能可以将图片或视频转化为 ASCII 艺术:
图片转文本格式 ASCII 艺术:输入图片,生成以 .txt 格式保存的 ASCII 艺术,支持多种语言字符集。 图片转图片格式 ASCII 艺术:输入图片,生成以 .png、.jpg 等格式保存的 ASCII 艺术。支持两种背景样式:黑底白字 或 白底黑字。 视频转视频格式 ASCII 艺术:输入视频,生成以 .avi、.mp4 等格式保存的 ASCII 艺术视频。 输出视频/图片可选为“灰度格式”或“彩色格式”,完全由用户控制。
输入图像原图如下:
运行脚本后得到如下输出
这个项目最近一次提交是 3 年之前了,自 “何同学” 陷抄袭风波之后,Star 也是蹭蹭的涨,昨天看着还是 3.7K,今天看已经 4.6K Star 📈了。
接下来让我们本地跑下这个项目,首先 clone 项目到本地
git clone git@github.com:vietnh1009/ASCII-generator.git
安装以下依赖
# 我当前的 Python 版本为 Python 3.9.6
pip3 numpy pillow
接下来运行 python3 img2img.py
文件,如果顺利的话得到如下输出结果:
注意,默认输出 ASCII 艺术风格的图像会保存在 data/output.jpg
文件中
不太顺利的,会得到如下报错:
这个错误是 sort_chars
函数中的 font.getsize
方法导致的,因为它在较新版本的 Pillow 中已经被弃用,解决方法如下:
对 img2img.py
文件中的如下内容进行替换
# 替换前
char_width, char_height = font.getsize(sample_character)
# 替换后
char_bbox = font.getbbox(sample_character) # 字符边界框
char_width = char_bbox[2] - char_bbox[0] # 宽度
char_height = char_bbox[3] - char_bbox[1] # 高度
还需要更新 utils.py
文件中的 sort_chars
函数,更新如下:
def sort_chars(char_list, font, language):
if language == "chinese":
char_bbox = font.getbbox("制")
elif language == "korean":
char_bbox = font.getbbox("ㅊ")
elif language == "japanese":
char_bbox = font.getbbox("あ")
elif language in ["english", "german", "french", "spanish", "italian", "portuguese", "polish", "russian"]:
char_bbox = font.getbbox("A")
else:
raise ValueError("Unsupported language")
char_width = char_bbox[2] - char_bbox[0]
char_height = char_bbox[3] - char_bbox[1]
num_chars = min(len(char_list), 100)
out_width = char_width * len(char_list)
out_height = char_height
out_image = Image.new("L", (out_width, out_height), 255)
draw = ImageDraw.Draw(out_image)
draw.text((0, 0), char_list, fill=0, font=font)
cropped_image = ImageOps.invert(out_image).getbbox()
out_image = out_image.crop(cropped_image)
brightness = [np.mean(np.array(out_image)[:, 10 * i:10 * (i + 1)]) for i in range(len(char_list))]
char_list = list(char_list)
zipped_lists = zip(brightness, char_list)
zipped_lists = sorted(zipped_lists)
result = ""
counter = 0
incremental_step = (zipped_lists[-1][0] - zipped_lists[0][0]) / num_chars
current_value = zipped_lists[0][0]
for value, char in zipped_lists:
if value >= current_value:
result += char
counter += 1
current_value += incremental_step
if counter == num_chars:
break
if result[-1] != zipped_lists[-1][1]:
result += zipped_lists[-1][1]
return result
再次运行 img2img.py
文件,查看运行结果。
还可以传参数指定输入的图像和输出的图像,这次让我们看下 img2img_color.py
脚本。
python3 img2img_color.py --output NewOutput.png --input beautiful-01.jpg
输入图像
输出图像
还有一些其它的生成参数,仓库并没有文档去做详细介绍,代码里都有写了,真感兴趣的可以翻下源代码,内容不是很多。
想学习和体验 ASCII 生成艺术的可以尝试下哦!
ASCII-generator: https://github.com/vietnh1009/ASCII-generator
近期文章推荐
扫描以下二维码加小编微信,备注 “ai”,一起交流 AI 技术!