灰度处理之图片转字符串

本文来自:灰度处理之图片转字符串

(并做了稍许改动)

背景知识介绍:

1、灰度值

把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从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]也可以           
}

运行结果:

字符画:

发布了76 篇原创文章 · 获赞 32 · 访问量 7918

猜你喜欢

转载自blog.csdn.net/wuwuku123/article/details/103895469