欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

灰度处理之图片转字符串

程序员文章站 2022-04-07 19:17:07
...

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

(并做了稍许改动)

背景知识介绍:

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]也可以           
}

运行结果:

灰度处理之图片转字符串

字符画:

灰度处理之图片转字符串

 

 

 

 

相关标签: EasyX easyX