C/C++图片转字符和字符图片(任何图片)

本程序用于图片转字符和字符图片(本人很懒,需要自行封装)

下面是简单的程序实现(不懂的函数自行查资料)

其他看注解

#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软件打开查看(下列为了观查到很好效果换了一张图)

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值