那个被何同学抄袭的项目 ASCII-generator 是干嘛用的?

职场   2024-11-21 21:22   河南  

近期 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((00), 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 生成艺术的可以尝试下哦!

参考资料
[1]

ASCII-generator: https://github.com/vietnh1009/ASCII-generator

近期文章推荐

  1. 40.9K Star!单图秒变主角,AI实时换脸神器引爆创意新潮流

  2. 只需 2 分钟,让 Bolt.new 写一个 “抖音”!

  3. 它!号称 V0 杀手,一个 AI 命令即可构建全栈应用,关键还开源

  4. 微软结合 JS + AI 搞了个全新脚本语言:带你感受下代码和自然语言的融合!

  5. 国产开源轻量级 AI 证件照项目,网友第一时间已经安排马斯克体验上了!

  6. Vue 开发者也要失业了?AI 工具 v0 已支持生成 Vue 代码了!

- 线 -

扫描以下二维码加小编微信,备注 “ai”,一起交流 AI 技术!

AI智见录
洞见AI前沿,分享技术与实践,助力智慧未来
 最新文章