灰度處理---圖片轉字符串



來源:微信公衆號「編程學習基地」
編程

圖片轉字符串

原圖:數組

轉換圖:微信

基本概念

灰度值
  • 把白色與黑色之間按對數關係分紅若干級,稱爲「灰度等級」。範圍通常從0到255,白色爲255,黑色爲0,黑白照片也稱爲灰度圖像
  • RGB值和灰度值的換算公式 Gray=(R * 30+G * 59+B * 11)/100,轉換後的顏色就是RGB(Gray,Gray,Gray)
字符畫
  • 字符畫就是用若干個字符組成,每一個字符去替換原圖的一塊區域
  • 有些字符會更接近白色(好比.),有些會更接近黑色(好比M),根據某一塊的平均灰度找到最接近的字符便可
  • 爲了節約時間,字符和接近的灰色值已經給出
字符
' ', '`', '.', '^', ',', ':', '~', '"', '<', '!', 'c', 't', '+', '{', 'i', '7', '?','u', '3', '0', 'p', 'w', '4', 'A', '8', 'D', 'X', '%', '#', 'H', 'W', 'M',
對應的字符
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

用到的函數

  • 圖形庫函數:
getpixel()    獲取某一點的顏色
RGBtoGRAY()   經過rgb返回對應的灰度值顏色
GetRValue()   獲得RGB值中的紅色部分,返回綠、藍部分也能夠
  • 文件操做 fputc()

示例代碼:函數

#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 };
int main()
{
	IMAGE img;
	loadimage(&img, L"test.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() / 8; ++i)
	{
		for (int j = 0; j < img.getwidth() / 8; ++j)
		{
			gray = 0;	//清零
			for (int x = 0; x < 8; ++x)
			{
				for (int y = 0; y < 8; ++y)
				{
					//統計這個區域中的灰度值 求平均
					gray += GetRValue(RGBtoGRAY(getpixel(j * 8 + x, i * 8 + y)));
				}
			}
			gray /= 8 * 8;	//取平均值
			//將灰度值  轉換成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]也能夠			
}
相關文章
相關標籤/搜索