图片转ASCII码(C++)
效果:
需要用到 EasyX 图形库 下载
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#define HEIGHT 1 // 取平均值区域(像素)
#define WIDTH 1 // 取平均值区域(像素) 1的话就是一个像素一个字符,值越高照片越模糊,宽高最好要一样
#define CHAR_HEIGHT 13 // 输出的字符高(像素) 字符像素宽高为13
#define CHAR_WIDTH 13 // 输出的字符宽(像素) 修改小的话,字符会显示不完整
char transcoding(int ascii)// 转码函数
{
if (ascii > 200)
return ' ';
if (ascii < 33)
return ascii + 33;
if (ascii > 126)
return ascii % 126 + 33;
return ascii;
}
int main(void)
{
int height, width, average;// 图片的高,宽,一小块图片颜色灰度的平均值
int x = 0, y = 0;// 输出字符的位置 x,y
IMAGE img;
loadimage(&img, _T("图片3.jpg"));// 这里是加载当前文件夹下的图片
SetWorkingImage(&img);// 设置绘图目标为 img 对象,获取宽高
height = getheight() / HEIGHT;// 需要画的行数
width = getwidth() / WIDTH; // 需要画的列数
initgraph(width * CHAR_WIDTH, height * CHAR_HEIGHT);// 初始化画板
for (int i = 0; i < height; i++)
{
x = 0;
for (int j = 0; j < width; j++)
{
average = 0;
for (int h = 0; h < HEIGHT; h++)
for (int w = 0; w < WIDTH; w++)
// 获取点颜色,灰色处理,得到RGB的R值(0-255)
average += GetRValue(RGBtoGRAY(getpixel(j * WIDTH + w, i * HEIGHT + h)));
average /= (HEIGHT * WIDTH);// 平均值计算
SetWorkingImage();// 设置窗口为绘图窗口
outtextxy(x, y, transcoding(average));// 转码输出到画板
SetWorkingImage(&img);// 设置绘图对象为img
x += CHAR_WIDTH;// 向右移动CHAR_WIDTH个像素,等待输出下一个字符
}
y += CHAR_HEIGHT;// 向下移动CHAR_HEIGHT个像素,输出下一行
}
saveimage(_T("ASCII图片.jpg"));// 保存绘制的图片
closegraph();// 关闭画板
printf("转换完毕!\n");
system("pause");
return 0;
}