使用Qt编写的图片转彩色字符画的源代码,基于C++的图片转Ascii码字符画源代码

ImageToAscillArt

这是一个将图片转换成字符画的小程序。

前言

首先说一下什么是字符画,顾名思义即通过字符组合成图片。具体分为两种:
1.通过将图片像素rgb经过公式转换成灰度值,然后由对应灰度值的ascii字符表示该像素,进而组成字符画。
2.通过html语言将提取到的像素rgb对应设置到字符上,然后组成字符画。

功能概述:

本程序主要有两个类组成:
ImgToAsciiArt:
该类负责将给定的图片转换成对应灰度的ascii字符串或者对应色彩的html字符串,主要提供下面两种方法,分别转换ascii字符串和html串,具体内容详见代码。
QString imgToAscii(QImage &image,QByteArray asciiArray=QByteArray());
QStringList imgToHtml(QImage &image, QString htmlStrSet, bool isOrder,bool isAlpha = false);
ImgToAsciiWidget:
该类则主要负责界面,包括参数的设置,图片文件的选择,字符画的生成与保存。

运行截图:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结:

该程序没啥实际用途,纯粹是周末无聊做着玩。
经过实际测试对于一些小分辨率层次分明的ico图片转换的效果还不错,目前程序转换ascii灰度值的字符由内部指定,因为不同字符的灰度有一定的序列,排序越准,字符画效果越好。而html字符画的字符可以由用户指定,但因为不同字体下一些字符的宽度是不同的,所以目前字体选择比较局限,内部使用字符等宽的宋体,可以实现所有的英文字符或者中文字符不论大小写宽度是一致的。但由于中文和英文的宽度是不一致的,所以暂时还不能中英文混合使用。此外由于彩色字符画是通过html文本字符串实现的,相对ascii码串较长,在实际字符画绘制时,会花费较多的时间,图片转换所得html串越长越慢,目前采用一定数量的行绘制一次,解决了长时间程序无响应的问题,但完全绘制完成还是需要一定的时间,暂时还没找到更好的办法。

完整代码下载地址:使用Qt编写的图片转彩色字符画的源代码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现 GIF 图片字符,可以使用 Qt 提供的 QImage 类来读取 GIF 图片,并将每一帧换为字符。下面是一个简单的示例代码: ```cpp #include <QApplication> #include <QImage> #include <QLabel> #include <QTimer> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 加载 GIF 图片 QImage gif("animation.gif"); // 创建标签显示字符 QLabel label; label.setStyleSheet("font-family: courier; font-size: 14px;"); label.setMinimumSize(gif.width() * 7, gif.height() * 14); label.show(); // 定时器更新标签内容 QTimer timer; int currentFrame = 0; connect(&timer, &QTimer::timeout, [&]() { // 获取当前帧的像素数据 QImage frame = gif.copy(currentFrame * gif.width(), 0, gif.width(), gif.height()); QByteArray asciiData; asciiData.reserve(frame.width() * frame.height()); for (int y = 0; y < frame.height(); ++y) { for (int x = 0; x < frame.width(); ++x) { QColor color(frame.pixel(x, y)); int gray = qGray(color.rgb()); char c = " .-+*#"[gray / 51]; asciiData.append(c); } asciiData.append('\n'); } label.setText(asciiData); currentFrame = (currentFrame + 1) % (gif.width() / gif.height()); }); timer.start(50); return app.exec(); } ``` 在这个示例中,我们使用QTimer 定时器来更新标签内容,每隔 50 毫秒切换到下一帧。对于每一帧的像素数据,我们将每个像素换为一个字符,并将这些字符拼接成一个字符串,最后设置给标签。注意,我们使用了一个字符集,将像素的灰度值映射到不同的字符上,以实现字符的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云哲-吉吉2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值