本程序用于图片转字符和字符图片(本人很懒,需要自行封装)
下面是简单的程序实现(不懂的函数自行查资料)
其他看注解
#include <stdio.h>
#include <graphics.h> // 图形库的头文件
#define HEIGHT 8 //转换后的高度
#define WIDTH 8 //转换后的宽度
#define ASCII1 32 //转换ASCII数量
#define CHAR_HEIGHT 30 //输出的字符高(像素)字符像素宽高为13
#define CHAR_WIDTH 30 //输出的字符宽(像素)修改小的话,字符会显示不完整
struct ASCII
{
char asc[ASCII1]; // ASCII码的范围
int gray[ASCII1]; //灰度值的范围
}as{ ' ','`','.','^',',',':','~','"','<','!','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 };
char AsciiToGray(struct ASCII as, int gray) // 使用二分查找来计算字符与灰度值的匹配
{
int low = 0; //低
int mid; //中
int high = ASCII1; //高
if (gray <= as.gray[0])
{
return as.asc[0]; //返回最低端Ascii码
}
else if (gray >= as.asc[ASCII1 - 1])
{
return as.asc[ASCII1 - 1]; //返回最高端scii码
}
else
{
while ((high - low) > 1) // 分查找的核心
{
mid = (low + high) / 2; //去中间值
if (gray > as.gray[mid]) //传入的灰度值大于结构体灰度值
{
low = mid + 1; //移动低标记
}
else
{
high = mid - 1; //移动高标记
}
}
return as.asc[low]; //返回ASCII码用于写入文本文件
}
}
void PhotoToAscii(struct ASCII as, char filename[]) //将图片转换为字符
{
int height, windth, gray; //图像的高、宽灰度值
int x = 0, y = 0;
IMAGE img; //加载图片文件
loadimage(&img, filename);
SetWorkingImage(&img); //得到转换后图像的宽和高
height = getheight() / HEIGHT;
windth = getwidth() / WIDTH;
FILE* file;
if ((file = fopen("字符图案.txt", "w")) == NULL) //打开文件r读w写
{
printf("文件打开失败! \n"), exit(0);
}
initgraph(windth * CHAR_WIDTH, height * CHAR_HEIGHT);//初始化画板
//putimage(0, 0,&img); //输出图片和字符图片 :如果需要显示图片加这段
for (int i = 0; i < height; i++)
{
x = 0;
for (int j = 0; j < windth; j++)
{
gray = 0;
for (int h = 0; h < HEIGHT; h++) //扫描每块像素的灰度值进行累加
{
for (int W = 0; W < WIDTH; W++)
{
gray += GetRValue(RGBtoGRAY(getpixel(j * WIDTH + W, i * HEIGHT + h))); //图像相素通道
//gray += GetGValue(RGBtoGRAY(getpixel(j * WIDTH + W, i * HEIGHT + h)));
//gray += GetBValue(RGBtoGRAY(getpixel(j * WIDTH + W, i * HEIGHT + h)));
}
}
gray /= (HEIGHT * WIDTH); //求像素点平均灰度值
gray = (255 - gray) * 90 / 255;
fputc(AsciiToGray(as, gray), file);
SetWorkingImage(); //设置窗口为绘图窗口
outtextxy(x, y, AsciiToGray(as, gray)); //转码输出到画板
SetWorkingImage(&img); //设置绘图对象为img
x += CHAR_WIDTH; //向右移动CHAR_WIDTH个像素,等待输出下一个字符
}
y += CHAR_HEIGHT; //向下移动CHAR_HEIGHT个像素,输出下一行
fputc('\n', file); //写入换行
}
saveimage("ASCII图片.jpg"); //保存绘制的图片
fclose(file); //关闭打开的文件
}
int main()
{
char filename[256]; //文件名的字符数组
printf("请输入文件名(包含扩展名) : "); //提示
gets_s(filename); //获取文件名
PhotoToAscii(as, filename); //将图片转换为字符
printf("转换成功! ");
return 0;
}
效果
自行调节图片通道像素(图片有些暗)
可用Sublime软件打开查看(下列为了观查到很好效果换了一张图)