如何使用 ASCII 符号绘制图像?

2024-02-01

我正在尝试从图像制作 ASCII 艺术,但由于某种原因,输出总是旋转,我检查了我的代码很多次,但我根本找不到错误。我猜这与imageWidth and imageHeight但对我来说一切看起来都很好。

代码可以在github https://github.com/randomprogramming/ASCII-Art


从图像中绘制 ASCII 艺术

假设一个字符占据的面积为21×8像素。所以首先你要把原始图像按比例缩小并得到这个区域的平均颜色,然后得到这个颜色的平均亮度,然后将其转换为字符。

原图:

ASCII 图片:


此代码从文件中读取图像,将其缩小到高度的 1/21 和宽度的 1/8,计算缩放区域的平均颜色,然后计算每种颜色的平均亮度,并选择该区域的一个字符相应的密度,然后将这些字符保存到文本文件中。

无需缩放scH=1 and scW=1,字符数等于原始图像中的像素数。

public static void main(String[] args) throws IOException {
  // assume that one character occupies an area of 21×8 pixels
  char[][] chars = readImage("/tmp/image.jpg", 21, 8);
  writeToFile("/tmp/image.txt", chars);
}

static char[][] readImage(String path, int scH, int scW) throws IOException {
  BufferedImage image = ImageIO.read(new File(path));
  int height = image.getHeight() / scH;
  int width = image.getWidth() / scW;
  char[][] chars = new char[height][width];
  for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
      // scaling image and accumulating colors
      int colorRGB = 0;
      for (int k = 0; k < scH; k++)
        for (int p = 0; p < scW; p++)
          colorRGB += image.getRGB(j * scW + p, i * scH + k);
      // get the average color
      Color color = new Color(colorRGB / (scH * scW));
      // read the R, G, B values of the color and get the average brightness
      int brightness = (color.getRed() + color.getGreen() + color.getBlue()) / 3;
      // get a character depending on the brightness value
      chars[i][j] = getDensity(brightness);
    }
  }
  return chars;
}

static final String DENSITY =
      "@QB#NgWM8RDHdOKq9$6khEPXwmeZaoS2yjufF]}{tx1zv7lciL/\\|?*>r^;:_\"~,'.-`";

static char getDensity(int value) {
  // Since we don't have 255 characters, we have to use percentages
  int charValue = (int) Math.round(DENSITY.length() / 255.0 * value);
  charValue = Math.max(charValue, 0);
  charValue = Math.min(charValue, DENSITY.length() - 1);
  return DENSITY.charAt(charValue);
}

static void writeToFile(String path, char[][] chars) throws IOException {
  FileWriter writer = new FileWriter(path);
  for (char[] row : chars) {
    String str = String.valueOf(row);
    writer.append(str).write("\n");
    System.out.println(str);
  }
  writer.flush();
  writer.close();
}

Output:

***************************************
***************************************
*************o/xiz|{,/1ctx*************
************77L*```````*_1{j***********
**********?i```````````````FZ**********
**********l`````````````````7**********
**********x`````````````````L**********
**********m?i`````````````iz1**********
************]x```````````\x{***********
********?1w]c>```````````La{]}r********
******jSF~```````````````````^xv>******
*****l1,```````````````````````*Sj*****
****7t```````````````````````````v7****
***uL`````````````````````````````t]***

See also: Restore an image from an ASCII art with Java https://stackoverflow.com/a/68219031/16314724Convert image to ASCII art https://stackoverflow.com/a/68279251/16314724

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ASCII 符号绘制图像? 的相关文章

  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • 使用缩略图器,我可以制作具有相同高度和宽度的缩略图,无论图像大小如何

    In 缩略图器 http code google com p thumbnailator 我正在制作缩略图 如果图像大小是 400 300 并且如果我执行以下操作 Thumbnails of new File original jpg si
  • 无法从 java 发送 48681 字节消息以保护 wcf 服务

    我必须使用相互身份验证从 java 调用安全的 WCF 服务 一切工作正常 除了我无法发送大小超过 48680 字节的消息 因此 48680 字节的消息已成功发送 但 48681 字节的消息未成功发送 并且 java 应用程序因读取超时异常
  • 如何实现 Eclipse 清理和构建(又名重建)?

    我删除了我的 binEclipse Indigo 中的文件夹 与 Helios 非常相似 现在我想知道如何重建我的 Java 项目 我只是找不到像 Netbeans 中那样的按钮 对于 Eclipse 您可以在下面找到重建选项项目 gt 清
  • Maven:无法在 OS X 上找到 java.lang 问题

    当我尝试时遇到以下问题mvn clean install显然它无法找到运行时 jar 但我需要做什么 错误日志 ERROR COMPILATION ERROR INFO ERROR Failure executing javac but c
  • 将双精度转换为二进制表示形式?

    我尝试将双精度数转换为其二进制表示形式 但使用此Long toBinaryString Double doubleToRawLongBits d 没有帮助 因为我有大量数字 Long 无法存储它们 即2 900 Long toBinaryS
  • 如何将 Struts 2 与 Velocity 和 Tiles 结合使用

    有人能够获得与 struts 2 一起使用的速度和图块吗 我在网上查找示例或教程时遇到一些问题 从我从邮件列表中收集到的信息来看 这似乎根本不可能 但邮件已经很旧了 https struts apache org docs tiles pl
  • 如何使用 Tomcat 启用浏览器缓存静态内容(图像、css、js)?

    如何使用 Tomcat 启用浏览器缓存静态内容 图像 css js 首选的解决方案是编辑 spring MVC 配置文件或 web xml 尝试 改变值
  • 无法在android中使用retrofit发出@Post请求

    我正在学习如何在 android 中使用改造 但是每当我尝试从互联网检索数据时 我的应用程序不会返回任何内容我的响应没有成功 我不知道如何修复当前我正在尝试发布的错误并使用此 URL 检索数据https jsonplaceholder ty
  • 字节流和字符流

    请解释一下什么是字节流和字符流 这些究竟意味着什么 Microsoft Word 文档是面向字节的还是面向字符的 Thanks 流是一种顺序访问文件的方式 字节流逐字节访问文件 字节流适用于任何类型的文件 但不太适合文本文件 例如 如果文件
  • 如何告诉 Eclipse 忽略 Ant build.xml 中的错误?

    我有一个使用 Maven 构建的 Eclipse 项目 并且我在 Eclipse 中使用 m2eclipse 插件来获得 Maven 支持 然而这个项目还包含一个build xml它并不用于实际构建项目 而只是用于编写脚本功能 作为项目开发
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • 当键位于父类中时,如何将一对多集合映射到连接的子类

    我想将一对多集合映射到子类 但集合的键是父类的属性 目前我正在映射 AbstractFoo Foo 和 Bar 类 如下所示
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • Java 8 流过滤器 - 基于排序的更新

    我正在尝试对过滤器中的字段进行排序 输入文件 样本记录 DocumentList Document id 5975ff00a213745b5e1a8ed9 u id mailboxcontent id 5975ff00a213745b5e1
  • 如果垃圾收集器没有删除未引用的对象,它们还能运行吗?

    如果一个对象正在等待垃圾收集 但包含一个在该对象的最后一个引用更改时正在运行的线程 那么该线程是否仍会运行并且代码是否仍会执行 那么您是否可能有一堆应该删除的幽灵对象 但它们对您的代码产生了影响 你如何防止这种情况发生 有没有办法让对象知道
  • 在Java中将32bpp图像转换为16bpp图像

    如何使用 Java 库将 32bpp 图像 ARGB 转换为 16bpp 图像 ARGB 出于我的好奇 在像素级别 这种转换有什么作用 如果我有一个保存像素值 包含所有通道 的 int 值 那么在转换发生后该 int 会有什么不同 32 位
  • 如何在Java中添加两个“卡”的值?

    我正在开发一个项目来模拟二十一点游戏中的第一笔交易 到目前为止 程序创建了两张随机等级 ACE 到 KING 和随机花色的牌 我正在努力创建一个切换表或 if else 梯形图 将两张卡的附加值分配为可变分数 下面的代码从概念上代表了我想要
  • java 更新进度条

    我有一个 JFrame 和以下组件 JButton jButton1 Progress Bar ProgressBar 及其公共静态 JLabel 状态及其公共静态 单击按钮时会执行不同的语句 我想在每个语句后更新我的进度条 这是我的代码
  • 只有创建视图层次结构的原始线程才能触摸其视图。在安卓上[重复]

    这个问题在这里已经有答案了 我只是一个初学者 所以请原谅我问一个可能愚蠢的问题 我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义 请有人告诉我为什么会发生此错误以及如何解决此问题 ThankYou 这是我的班级 public cl

随机推荐