首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c++视频转字符画_c++字符数组转化为字符串

c++视频转字符画_c++字符数组转化为字符串

作者头像
全栈程序员站长
发布2022-09-23 20:46:46
发布2022-09-23 20:46:46
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

文章目录

EasyX库

运行此程序需要有graphics图形库,需要的小伙伴可以点击下方连接下载: https://download.csdn.net/download/weixin_45525272/46595007

双击exe,安装对应VS版本的库即可

效果展示

输入图片路径后,回车 运行后当前目录会出现一个txt文件,转换成功

哈哈,可能这样看不出来 上原图

字符图片如下

不要放大此图,看着是不是有张人脸,很像原图

代码

直接上代码,放控制台即可运行

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <graphics.h> // 图形库的头文件

#define HEIGHT 8 // 转换后的高度
#define WIDTH 8 // 转换后的宽度
#define ASCII1 32 // 转换ASCII数量

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];		// 返回最高端Ascii码
	}
	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;		// 图像的高、宽、灰度值
	IMAGE img;

	// 加载图片文件
	loadimage(&img, filename);
	SetWorkingImage(&img);

	// 得到转换后图像的宽和高
	height = getheight() / HEIGHT;
	windth = getwidth() / WIDTH;

	// 打开文件 r 读 w 写
	FILE *file;
	if ((file = fopen("字符图案.txt", "w")) == NULL)
	{ 
   
		printf("文件打开失败!\n");
		exit(0);
	}

	for (int i = 0; i < height; i++)
	{ 
   
		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 /= (HEIGHT*WIDTH);
			gray = (255 - gray) * 90 / 255;

			fputc(AsciiToGray(as, gray), file);
		}
		// 写入换行
		fputc('\n', file);
	}
	// 关闭打开的文件
	fclose(file);
}


int main()
{ 
   
	// 文件名的字符数组
	char filename[256];

	printf("请输入文件名(包含扩展名):");		// 提示
	gets_s(filename);							// 获取文件名
	PhotoToAscii(as,filename);					// 将图片转换为字符
	printf("转换成功!");

	return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170912.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • EasyX库
  • 效果展示
  • 代码
    • 直接上代码,放控制台即可运行
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档