字符画制作原理揭秘及代码复现-python

news2024/11/26 11:47:34

字符画制作原理揭秘及代码复现.jpg
视频讲解链接:https://www.bilibili.com/video/BV1JC4y1d7vb/

  • 网站
  • 原理
  • 图像艺术画-代码讲解
  • 文字艺术画-代码讲解

字符画的原理

字符画(ASCII art)是一种通过使用文本字符来创建图像的艺术形式。字符画的原理基于以下概念:

  1. 字符集合:字符画使用一个有限的字符集合来表示不同的灰度值或颜色。这些字符可以是标准的ASCII字符,也可以是扩展字符集合,具体取决于艺术家的选择。通常使用的字符包括字母、数字、符号以及空格。
  2. 灰度值映射:每个字符都对应一个灰度值或颜色值。通常,字符集合中的字符按照它们的密度和暗度进行排列,使得在字符画中可以更精确地表示图像的不同部分。
  3. 图像转换:要创建字符画,首先需要将目标图像转换为灰度图像,其中每个像素点都表示灰度值,通常在0(黑色)到255(白色)之间。这些灰度值将用于选择适当的字符来代表图像的不同部分。
  4. 字符替代:将图像的每个像素映射到字符集合中的一个字符,选择的字符通常是与对应像素的灰度值相匹配的字符。较亮的像素将映射到较轻或稀疏的字符,而较暗的像素将映射到较密集或较深的字符。
  5. 分辨率控制:字符画的质量和精细度取决于字符集的大小和输出设备的分辨率。较大的字符集和更高的分辨率可以生成更详细和精细的字符画,但也会增加字符的数量。

总之,字符画的原理是将图像的每个像素映射到一个字符,通过选择适当的字符来表示不同的灰度值或颜色,从而在文本界面上创建出图像。字符画是一种有趣的艺术形式,常常用于表达创意、传达信息或简化图像以适应特定的显示条件。它们也可以通过计算机程序自动生成,将图像转换为字符画的过程称为字符画生成。

字符的排列顺序的讲究

ASCII字符集中的字符排列顺序通常是按照字符的密度或灰度级别从高到低排列的,这样可以在生成字符画时更好地反映图像的亮度或密度变化。具体来说:

  • "@" 通常被视为最暗的字符,因此通常用于表示图像中的最黑暗部分。
  • " "(空格) 通常被视为最亮的字符,用于表示图像中的最亮部分。
  • 中间的字符 "%#*+=-:." 根据其在ASCII字符集中的灰度级别递增,用于表示图像中的中间亮度级别。

这个字符排列顺序的选择是为了尽可能准确地模拟图像中的灰度级别,使字符画看起来更接近原始图像。

然而,这只是一种常见的字符排列顺序,并没有固定的规则。在生成字符画时,您可以根据自己的喜好和需求选择不同的字符集和排列顺序。根据所选字符集和排列顺序,字符画的外观和效果可能会有所不同。因此,您可以根据自己的审美标准和具体情况进行调整和实验。

图像转艺术字

# -*- coding: utf-8 -*-
# @Time    : 2023/10/10 11:25
# @QQ  : 2942581284
# @File    : 字符画.py
from PIL import Image
# 字符集,您可以根据需要进行修改
ASCII_CHARS = "@%#*+=-:. "
# 将灰度值映射到字符
def scale_gray(value):
    scale = (len(ASCII_CHARS) - 1) / 255
    return ASCII_CHARS[int(value * scale)]
# 将图像转换为字符画
def image_to_ascii(image_path, output_width=100):
    image = Image.open(image_path)
    width, height = image.size
    aspect_ratio = height / width
    new_height = int(output_width * aspect_ratio)
    resized_image = image.resize((output_width, new_height))
    grayscale_image = resized_image.convert('L')  # 转换为灰度图像
    # 将灰度图像转换为NumPy数组
    # import numpy as np
    # grayscale_matrix = np.array(grayscale_image)
    # 打印灰度矩阵
    # print(grayscale_matrix)
    ascii_art = ""
    for y in range(new_height):
        for x in range(output_width):
            pixel_value = grayscale_image.getpixel((x, y))
            ascii_art += scale_gray(pixel_value)
        ascii_art += "\n"

    return ascii_art

if __name__ == "__main__":
    input_image_path = "kun.jpg"  # 替换为您自己的图像文件路径
    # input_image_path = "pattern_with_padding.png"  # 替换为您自己的图像文件路径
    output_width = 200  # 输出字符画的宽度
    ascii_art = image_to_ascii(input_image_path, output_width)
    print(ascii_art)
    with open(input_image_path+'.txt','w',encoding='utf-8') as f:
        f.write(ascii_art)

文字转图像

from PIL import Image, ImageDraw, ImageFont
import numpy as np
hanzi = "编程启航"
font_size = 48
# 使用系统字体或指定字体文件
font = ImageFont.truetype("1.ttf", font_size)
# 计算汉字的大小
text_bbox = font.getbbox(hanzi)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]
# 设置填充大小
padding = 20
# 创建一个空白图像,大小根据文本计算,并添加填充
pattern_size = (text_width + 2 * padding, text_height + 2 * padding)
pattern_image = Image.new('RGB', pattern_size, color=(255, 255, 255))
pattern_draw = ImageDraw.Draw(pattern_image)
# 在花纹背景上绘制汉字,考虑填充
pattern_draw.text((-text_bbox[0] + padding, -text_bbox[1] + padding), hanzi, fill=(0, 0, 0), font=font)
# 将花纹图像转换为NumPy数组以便处理
pattern_data = np.array(pattern_image)
# 在这里,您可以对花纹进行任何自定义的图像处理操作,例如添加滤镜或效果
# pass
# 创建Pillow图像对象并显示
pattern_image = Image.fromarray(pattern_data)
pattern_image.show()
# 保存花纹图像
pattern_image.save("pattern_with_padding.png")

更多宝藏

🍇🍉🍊🍏🍋🍅🥝🥥🫒🫕🥗
视频推送看这里🤤:
[https://space.bilibili.com/1909782963](https://space.bilibili.com/1909782963](https://space.bilibili.com/1909782963))
项目仓库看这里🤗:
[https://github.com/w-x-x-w](https://github.com/w-x-x-w](https://github.com/w-x-x-w))
[https://gitee.com/w-_-x](https://gitee.com/w--x](https://gitee.com/w--x))
公众号名称😮:编程启航
博客文章看这里🤭:
[https://blog.csdn.net/weixin_62650212](https://blog.csdn.net/weixin_62650212](https://blog.csdn.net/weixin_62650212))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能优化算法应用:基于被囊群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于被囊群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于被囊群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.被囊群算法4.实验参数设定5.算法结果6.参考文献7.…

玉渊谭天对电影色彩分析的“蚊香图”复现-python

视频教程链接:https://www.bilibili.com/video/BV1Lu4y1t7FG/ 最终的实现效果如下: 前几天刷抖音刷到了玉渊谭天对于电影抽取画面制作“蚊香图”,相关视频片段如下。 这种制作”蚊香图“的特效当时有点触动到到我,根据色彩来分…

jmeter测试dubbo接口

本文讲解jmeter测试dubbo接口的实现方式,文章以一个dubbo的接口为例子进行讲解,该dubbo接口实现的功能为: 一:首先我们看服务端代码 代码架构为: 1:新建一个maven工程,pom文件为: 1…

PyQt6 QLabel标签控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…

性能测试必学教程之Jmeter:nmon性能系统监控工具

一、Nmon介绍 Nmon得名于 Nigel 的监控器,是IBM的员工 Nigel Griffiths 为 AIX 和 Linux 系统开发的,使用 Nmon 可以很轻松的监控系统的CPU、内存、网络、硬盘、文件系统、NFS、高耗进程、资源和 IBM Power 系统的微分区的信息 Nmon是一款计算机性能系…

Git远程仓库常用开发命令和理解

远程仓库 创建与合并分支 每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。 HEAD严格来说不是指向提交,而…

Python教程:DataFrame列数据类型的转换

Pandas提供了多种数据类型转换方法。可以使用astype()函数来转换数据类型。例如,可以将字符串类型的列转换为整数类型的列: # Author : 小红牛 # 微信公众号:wdPython import pandas as pd# 创建包含字符串类型列的DataFrame df pd.DataFra…

Postman如何使用(三):使用数据文件

数据文件是非常强大的方式使用不同的测试数据来测试我们的API,以检查它们是否在各种情况下都能正常运行。我们可以认为数据文件是“Collection Runner”中每个请求的参数。下面,我们通过一个例子来说明如何使用数据文件。 这篇文章需要结合下面两个文件进…

第二十二章 解读pycocotools的API,目标检测mAP的计算COCO的评价指标(工具)

Pycocotools介绍 为使用户更好地使用 COCO数据集, COCO 提供了各种 API。COCO是一个大型的图像数据集,用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi,这些api有助于在COCO中加载、解析和可视化注释。 …

Linux环境下自动化创建大量的账号

参考《鸟哥的Linux私房菜基础篇第四版》13.7.2节微调而成: 下面脚本的目的是为服务器的管理员自动化创建大量的账号,节省生命。 #!/bin/bash # This shell script will create amount of Linux login accounts for you. # 1. check the "accounta…

ubuntu20.04打不开github网址的有效解决方案

问题描述:重装的ubuntu系统,chrome浏览器刚开始还能打开github网址,然后突然就打不开了,换网络也不行。 解决方案步骤 1,查询你的电脑IP对应的github网址信息 2,修改host文件,添加第1步查询到…

线程的认识,本质,和进程的区别,哪些结构是共享/独立的,切换成本,不同os下的线程

目录 再次认识进程 用户视角 内核视角 引入线程 概念 调度的基本单位 模拟出图像 思考 线程的本质 线程和进程的区别 线程哪些结构是共享的 引入 地址空间 系统资源 ​编辑 线程哪些结构是单独拥有 引入 地址空间 系统资源 线程间切换的成本更低 linu…

【强化学习】动态规划算法实践

文章目录 【强化学习】动态规划算法实践一. 实验过程1.1 Environment1.2 Policy Iteration1.3 Policy Evaluation1.4 Policy Improvement1.5 Value Iteration 二. 实验结果与分析2.1 分析Policy Iteration和Value Iteration收敛误差随着迭代次数的分布曲线 【强化学习】动态规划…

性能测试必会技能之Jmeter:利用jmeter插件收集性能测试结果汇总报告和聚合报告

利用jmeter插件收集性能测试结果 汇总报告(Summary Report ) 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍: 所有数据写入一个文件:保存测试结果到本地…

【c++模版】

在计算机科学的世界里,模板是一种非常强大的工具,它允许我们编写通用的代码,这些代码可以处理多种数据类型。在C中,模板是实现泛型编程的主要方式之一。本文将详细介绍C模板的基本概念,并通过一些有趣的例子和现实生活…

Unity 关于Input类的使用

Input类在我们游戏开发中需要获取外设设备(比如键盘、鼠标、游戏手柄等)进行交互时,基本都会用到。 它主要有以下一些常用的方法。 1、GetKey(KeyCode key),检测按键是否被按下; 2、GetKeyDown(KeyCode key)&#x…

什么是CAS/CAS的应用/CAS的ABA问题

文章目录 CAS1. 什么是CAS2. CAS的应用2.1 实现原子类2.2 实现自旋锁 3. CAS的ABA问题3.1 什么是ABA问题3.2 ABA问题引来的BUG3.3 解决方案 CAS 1. 什么是CAS CAS: 全称Compare and swap, 字面意思:”比较并交换“. 操作: 设V为内存中的值, A为寄存器中的值(旧的预期值), B也…

无人零售已成为新兴趋势

无人零售已成为新兴趋势 在新零售浪潮中,必然会涌现新的商业形态,而无人零售则是其中典型代表之一。传统零售受制于人力和场地等限制,消费者体验较差,如长时间排队、缓慢结账、距离过远等问题。而无人零售解决方案,包括…

面试官:java如何实现线程间通信?

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

PyQt6 QLineEdit单行文本框控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…