來源:微信公衆號「編程學習基地」
編程
原圖:數組
轉換圖:微信
字符 ' ', '`', '.', '^', ',', ':', '~', '"', '<', '!', '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值中的紅色部分,返回綠、藍部分也能夠
示例代碼:函數
#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]也能夠 }