C/C++打造图像转字符工具(非常有趣)

简介: C/C++打造图像转字符工具(非常有趣)

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;
}


相关文章
|
2月前
|
编译器 vr&ar C语言
高效c/c++日志工具zlog使用介绍
高效c/c++日志工具zlog使用介绍
216 2
|
2月前
|
存储 C++
基于C++的简易文件压缩与解压缩工具设计与实现
基于C++的简易文件压缩与解压缩工具设计与实现
50 3
|
2月前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
70 1
|
2月前
|
监控 算法 Linux
【C/C++ 实用工具】CPU使用率监控工具对比
【C/C++ 实用工具】CPU使用率监控工具对比
69 0
|
2月前
|
算法 Unix Linux
【C/C++ 实用工具】性能分析工具一览
【C/C++ 实用工具】性能分析工具一览
69 0
|
2月前
|
算法 安全 Java
【C/C++ 实用工具】静态代码检测工具和平台的一览
【C/C++ 实用工具】静态代码检测工具和平台的一览
134 0
|
2月前
|
数据可视化 关系型数据库 编译器
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
331 2
|
2月前
|
Java Linux C++
性能工具之 C/C++ 分析工具 valgrind
【5月更文挑战第26天】性能工具之 C/C++ 分析工具 valgrind
26 2
性能工具之 C/C++ 分析工具 valgrind
|
2月前
|
数据处理 C++
C++程序字符串流
C++程序字符串流
26 2
|
2月前
|
IDE Linux 开发工具
一网打尽:C++远程调试工具和策略全指南
一网打尽:C++远程调试工具和策略全指南
90 2