大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
文章目录
EasyX库
运行此程序需要有graphics图形库,需要的小伙伴可以点击下方连接下载:
https://download.csdn.net/download/weixin_45525272/46595007
双击exe,安装对应VS版本的库即可
效果展示
输入图片路径后,回车 运行后当前目录会出现一个txt文件,转换成功
哈哈,可能这样看不出来
上原图
字符图片如下
不要放大此图,看着是不是有张人脸,很像原图
代码
直接上代码,放控制台即可运行
#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;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170912.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...