灰度处理之图片转字符串
程序员文章站
2022-04-07 19:17:07
...
本文来自:灰度处理之图片转字符串
(并做了稍许改动)
背景知识介绍:
把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。在医学、图像识别领域有很广泛的用途。
2、字符画
字符画就是用若干个字符组成,每个字符去替换原图的一块区域
有些字符会更接近白色(比如.),有些会更接近黑色(比如M),根据某一块的平均灰度找到最接近的字符即可
主要的知识点:数组、循环、easyX中函数的使用;
COLORREF getpixel(int x, int y); //这个函数用于获取点的颜色。
COLORREF RGBtoGRAY(
COLORREF rgb //该函数用于返回与指定颜色对应的灰度值颜色。
);
BYTE GetRValue(COLORREF rgb); // 返回指定颜色中的红色值。
示例代码:
#include<stdio.h>
#include<easyx.h>
char GetCh(int data);
char ch[] = { ' ', '`', '.', '^', ',', ':', '~', '"', '<', '!', 'c', 't', '+',
'{', 'i', '7', '?', 'u', '3', '0', 'p', 'w', '4', 'A', '8', 'D', 'X', '%', '#', 'H', 'W', 'M' };
char num[] = { 0, 5, 7, 9, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41,43, 45, 47, 49, 51, 53, 55, 59, 61, 63, 66, 68, 70 };
#define block 4 //分成的块数
int main()
{
IMAGE img;
loadimage(&img, L"test1.bmp");
initgraph(img.getwidth(), img.getheight());
putimage(0, 0, &img);
FILE *fp = fopen("图片转字符.txt", "w");
if (!fp) {
return 0;
}
int gray; //灰度值
for (int i = 0; i < img.getheight() / block; ++i)
{
for (int j = 0; j < img.getwidth() / block; ++j)
{
gray = 0; //清零
for (int x = 0; x < block; ++x)
{
for (int y = 0; y < block; ++y)
{
//统计这个区域中的灰度值 求平均
gray += GetRValue(RGBtoGRAY(getpixel(j * block + x, i * block + y)));
}
}
gray /= block * block; //取平均值
//将灰度值 转换成0~70之间的值 匹配数组中的数字 找到对应字符
fputc(GetCh(70 - gray * 70 / 255), fp);//0~255之间 --->0~70之间的数字
}
fputc('\n', fp);//每一行加个换行符号
}
fclose(fp);
getchar();
closegraph();
return 0;
}
char GetCh(int data)
{
//快速查找
int left = 0, right = 31, index; //num的最大元素下标是31
while (left < right)
{
index = (left + right) / 2;
if (num[index] == data) return ch[index]; //找到数字 直接返回对应的字符
else if (num[index] > data) right = index - 1; //往左找
else left = index + 1;
}
//退出的条件 left>=right
return ch[left]; //return ch[right]也可以
}
运行结果:
字符画:
上一篇: 基于VueJs实现的井字棋小游戏
下一篇: EasyX入门篇