C++ 将图片转换为字符画 附成品程序

    技术2022-07-17  79

    目录

    原理示例 代码测试结果 成品程序

    原理

    数字图片实际上是一个个像素小点拼凑而成的。(一个数字序列表示的图像中的一个最小单位称为像素)

    像素的颜色可以由红(RED)、绿(GREEN)、蓝(BLUE)三个颜色通道的变化以及它们相互之间的叠加而形成,这也就是我们常说的RGB色彩模式。

    这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。

    另外一种颜色表示方式,灰度图,就是我们平常见到的黑白图。

    灰度的概念类似于美术中颜色的亮度。

    将白色与黑色之间按对数关系分为256阶,并用这些阶数对图像进行表示。

    示例

    而字符画则在此基础上,用字符代替阶数来对图像进行表示。 有一些字符,@B%8&WM#,适合表示深色的部分。 有一些字符,:,"^'. ,适合表示浅色的部分。

    中心思想就是根据字符本身的形态而有选择地去替代灰度表示图像。


    代码

    此代码需导入OpenCV库,详细配置教程后补。

    #include<iostream> #include <fstream> //需要用到OpenCV库,下面导入三个常用的头文件 #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace std; using namespace cv; int main() { const char character[] = "@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\"^`'. "; const char * img_path = R"(D:\3.jpg)"; //图片的绝对路径 const char* txt_path = R"(D:\txt.txt)"; //文本的绝对路径 Mat img = imread(img_path); //原图的RGB矩阵 //cout << img << endl; Mat gray_img; cvtColor(img, gray_img, COLOR_RGB2GRAY); //灰度矩阵 //转化 string str; for (int y = 0; y < gray_img.rows; y++) { for (int x = 0; x < gray_img.cols; x++) { int grayVal = (int)gray_img.at<uchar>(y, x); //获取坐标像素点的灰度值。(强制类型转换是为了避免负值) int index = 69.0 / 255.0 * grayVal; //根据灰度值选取字符 str += character[index]; } str += "\r\n"; } //写入文本文件中 ofstream outStream; outStream.open(txt_path); outStream << str << endl; outStream.close(); return 0; }

    测试结果

    原图 字符画

    鉴于字符数比较多,一般需要调小字体,并缩小视窗才能看到。

    设置 - 取消自动换行 字体调至最小8号 CTRL & - 缩小视窗


    成品程序

    图片转字符画程序。 程序较为简陋,需手动输入图片的地址。 此处不建议复制文件属性中的地址会出现错误的。

    错误解析 文件属性地址信息 会出现奇怪字符 慎用!!!

    强烈建议手打。

    图片转字符画.exe

    Processed: 0.008, SQL: 9