将位图转换为 ASCII 艺术图

2023-12-06

这样的图像转换算法是如何工作的?

我想将位图转换为 ASCII 艺术。谁能帮我看看我应该使用哪种算法?

                 .   W    ,                
                 W   W    @                
                 W  ,W    W                
              ,  W, :W*  .W  .             
              #  WW @WW  WW  #             
              W  WW.WWW  WW: W             
              W. WW*WWW# WW@ W             
           * :WW.WWWWWWW@WWW@W  #          
          +* #WW#WWWWWWWWWWWWW# W          
          W# @WWWWWWWWWWWWWWWWW W          
          WW WWWWWWWWWWWWWWWWWW W          
          WW WWWWWWWWWWWWWWWWWW@W#         
         ,WW.WWWWWWWWWWWWWWWWWWWWW         
          WW@WWWWWWWWWWWWWWWWWWWWW         
        : WWWWWWWWWWWWWWWWWWWWWWWW :       
        @ WWWWWWWW@WWWWWWW@@WWWWWW.        
        W*WWWWWW::::@WWW:::::#WWWWW        
        WWWWWW@::   :+*:.   ::@WWWW        
        WWWWW@:*:.::     .,.:.:WWWW        
        @WWWW#:.:::.     .:: #:@WWW        
        :WWW@:#. ::     :WWWW:@WWWW        
         WWW#*:W@*@W     .   W:#WWW        
        #WWWW:@      ::   ::  *WWWW        
        W@WW*W  .::,.::::,:+  @@WW#,       
        WWWW## ,,.: .:::.: .  .WWW:,       
        @WWW@:   W..::::: #.  :WWWW        
         WWWW::  *..:.  ::.,. :WWWW        
         WWWW:: :.:.:   :  :: ,@WW@        
         WWWW:  .:,  :  ,,     :WW,        
         .: #         :  ,     : *         
          W +    .,  :::  .,   : @         
          W ::                .: W         
       @,,,W:.  ,, ::*@*:,  . :@W.,,@      
     +.....*: : : .#WWWWW:  : .#:....+,    
    @...:::*:,, : :WWWWWWW, ,  *::::..,#   
  :...::::::W:,   @W::::*W.   :W:::::...#  
 @@@@@@@@@@@W@@@@@W@@@@@@W@@@@@W@@@@@@@@@@:

将图像转换为 ASCII 艺术

  • Size.假设一个字符的平均高度是其宽度的两倍,为了保持相同的比例,我们必须缩小原始图像。因此,使用等宽字体是有意义的。

  • Color.我们可以根据字符的密度将像素的亮度转换为字符。因此,转换高对比度的灰度或黑白图像更为准确。

原图:

Coding Horror

缩放的 ASCII 图片:


scH=16, scW=8  

scH=8, scW=4  

scH=2, scW=1  
scH=16, scW=8 scH=8, scW=4 scH=2, scW=1
class ImageToASCIIArt {
  public static void main(String[] args) throws IOException {
    char[][] chars = readImage("/tmp/image.jpg", 16, 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();
  }
}

See also: Restore an image from an ASCII artDraw an ASCII art from an image

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

将位图转换为 ASCII 艺术图 的相关文章

  • Blob 的簇生长

    考虑以下来自 Mathworks 的图像 我已经用标签标记了斑点 L num bwlabel I 如何迭代连接所有斑点 即从一个斑点开始 找到离它最近的一个 考虑最左边的两个斑点 可以从一个斑点的许多点绘制许多条线来连接到另一个斑点blob
  • 按下按钮时清除编辑文本焦点并隐藏键盘

    我正在制作一个带有编辑文本和按钮的应用程序 当我在 edittext 中输入内容然后单击按钮时 我希望键盘和焦点在 edittext 上消失 但我似乎无法做到这一点 我在 XML 中插入了这两行代码 android focusable tr
  • 从 Bitmap 类创建 .bmp 图像文件

    我创建了一个使用套接字的应用程序 客户端在其中接收图像并将图像数据存储在 Bitmap 类中 谁能告诉我如何创建一个名为我的图像 png or 我的图像 bmp来自此 Bitmap 对象 String base64Code dataInpu
  • 在 Java 中填充布尔数组

    作为一名相当新手的 Java 程序员 我给自己设定了一个艰巨的挑战 尝试编写一个简单的文本冒险 不出所料 我已经遇到了困难 我试图为我的 Location 类提供一个属性来存储它包含的退出 我为此使用了一个布尔数组 本质上保存代表每个出口的
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • MongoDB:尝试从 JSON 读取 Long 导致 java.lang.Integer 无法转换为 java.lang.Long

    我有一个代码可以从 MongoDB 读取特定格式的数据 我需要测试一下 为此 我使用要测试的数据创建一个 JSON id ObjectId 57552e32e4b0839ede67e0af serial 574000690 startDat
  • Java 反射:如何检索匿名内部类?

    我在另一个类中有一个匿名内部类 SomeClass Both SomeClass class getClasses and SomeClass class getDeclaredClasses 返回空数组 我在中找不到一些关于此的提示Cla
  • 将 EditText 聚焦在设备上运行的 PopupWindow 中时出现异常

    我正在为 Android 开发一个弹出窗口 它正在工作 我在上面添加了一个 EditText 和一个按钮 当在 ADV 上运行时 它可以正常工作 而在设备上运行时 当我专注于 EditText 时 这会抛出一个奇怪的异常 android v
  • perl 和 java 正则表达式功能之间有什么区别?

    perl 和 java 在支持哪些正则表达式术语方面有什么区别 这个问题仅涉及正则表达式 并且特别排除了how可以使用正则表达式 即使用正则表达式的可用函数 方法 以及语言之间的语法差异 例如java要求转义反斜杠等 特别令人感兴趣的是 j
  • Java 7 中 Object 和 int 的比较

    最近我偶然发现了一个问题 让我停下来思考 对我来说 下面的代码应该总是会触发错误 但是当我的一位同事问我为什么 Eclipse 没有显示错误时 我无法回答任何问题 class A public static void main String
  • 在Python中确定句子中2个单词之间的邻近度

    我需要确定 Python 句子中两个单词之间的接近度 例如 在下面的句子中 the foo and the bar is foo bar 我想确定单词之间的距离foo and bar 确定之间出现的单词数foo and bar 请注意 该词
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • Java .split("|") 不工作

    我刚刚遇到了一个问题分割法 http docs oracle com javase 6 docs api java lang String html split 28java lang String 29for 字符串不适用于字符 作为一个
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • 计算移动的球与移动的线/多边形碰撞的时间(2D)

    我有一个多边形 里面有一个移动的球 如果球撞到边界 它应该反弹回来 My current solution I split the polygon in lines and calculate when the ball hits the
  • 如何配置嵌入式 MongoDB 以在 Spring Boot 应用程序中进行集成测试?

    我有一个相当简单的 Spring Boot 应用程序 它公开一个小型 REST API 并从 MongoDB 实例检索数据 对 MongoDB 实例的查询通过基于 Spring Data 的存储库 下面的一些关键代码 Main applic
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe
  • 将带有时区的 Joda-Time `DateTime` 转换为没有时区的 DateTime?

    Given a DateTime http www joda org joda time apidocs org joda time DateTime html例如2015 07 09T05 10 00 02 00 using 乔达时间 h
  • 线程“main”中出现异常 java.lang.UnsatisfiedLinkError: ... \jzmq.dll: 找不到依赖库

    我有一个使用 ZMQ 的 java 应用程序 我已经能够在我的 Win7 PC 上运行它 我将 jzmq dll 放在 jar 可执行文件所在的同一文件夹中 然后通过命令 java jar myapp jar 运行它 我的下一步是将其移至服
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

  • Kubernetes 中具有子域重定向的通配符 SSL 证书

    我已将 Kubernetes 配置为使用 cert manager 和 LetsEncrypt 对我的所有应用程序使用一个通配符 SSL 证书 现在的问题是我无法配置子域重定向 因为 Ingress 有点 僵硬 以下是我试图实现这一目标的方
  • 将 char 存储到 int 变量中

    我正在学习 C 中的隐式转换 我读了下面的例子 char a std cin gt gt a I can enter an integer like 56 here std cout lt
  • 当我尝试使用最新的依赖项构建 Maven 空手道项目时出现编译错误

    I m new to Karate API automation tool and just try to set up the tool I m getting Compilation errors when I try to compi
  • 使用 setRepeating() 方法了解下一个闹钟时间

    我有时会在上午 9 00 下午 1 00 晚上 7 00 等时间设置 3 个待处理意图 这些意图每天使用 setRepeating 方法递归触发 这里我将所有这些待处理的意图唯一请求代码保存在本地 SQLite 数据库中 在这里 每当触发警
  • FFREE ST(i) 修改 x87 标记字中的哪些位?

    这个例子是用 NASM 编写的 section bss var28 resb 28 section text main Initialize finit fldpi Read Tag Word fstenv var28 mov ax var
  • 闭包中引用的生命周期

    我需要一个闭包来引用其封闭环境中的对象的一部分 该对象是在环境中创建的 并且范围仅限于该环境 但一旦创建 它就可以安全地移动到闭包中 用例是一个函数 它执行一些准备工作并返回一个将完成其余工作的闭包 这种设计的原因是执行限制 第一部分工作涉
  • 向量的数值导数

    我遇到一个向量 x Nx1 相对 于另一个与 x 大小相同的向量 t 时间 的数值导数的问题 我执行以下操作 以 x 被选为正弦函数为例 t t0 ts tf x sin t xd diff x ts 但答案 xd 是 N 1 x1 并且我
  • 删除名称以特定字符串开头的所有表

    如何删除名称以给定字符串开头的所有表 我认为这可以通过一些动态 SQL 来完成INFORMATION SCHEMA tables 如果数据库中有多个所有者 您可能需要修改查询以包含所有者 DECLARE cmd varchar 4000 D
  • 为 WebGL 示例嵌入 ChakraHost (c#)

    我研究了涉及嵌入 javascript 框架 paper js 的示例 用于通过 ChakraHost 的 JsBridge 实现将输出绘制到 XAML 的 CanvasControl 要包含 paper js 框架和调用该框架的 java
  • ValueError: check_hostname 需要使用 Fiddler 4 的 server_hostname

    This question最近刚刚发布的有一些有用的答案 但与我的不一样 我正在从 ArcGIS Pro Notebook 运行 urllib3 1 26 4 和 Python 3 7 我还打开了 Fiddler 4 因为我想在对脚本进行故
  • 当我的编译器不符合标准时如何将数组成员归零

    我的编译器 C Builder6 在语法上允许数组成员初始化 至少为零 但实际上它并没有真正做到这一点 因此 下面给出的示例中的断言会失败 具体取决于上下文 include
  • 导航到新页面并显示警告框

    我正在使用 ASP Net WebForm 开发一个应用程序 一旦用户单击按钮 应用程序将导航到新页面并提示对话框 欢迎来到 JackiesGame 但是 我能够导航到新页面 但不显示警报对话框 以下是我的示例代码 void cmdCanc
  • PHP 中简单干净的 xml 操作

    我正在尝试寻找一种在 php 中轻松修改 xml 的方法 PHP 文档对于如何轻松操作 xml 非常令人困惑 我喜欢 SimpleXml 如何轻松查找标签 属性 但它似乎不允许您轻松添加子树或替换现有的子树 关于使用什么有什么建议吗 我的用
  • 为什么jstl的formatNumber货币符号区域设置在设置currencyCode时是特定的

    我使用 formatNumber 如下
  • ViewChild 和 ContentChild 的有效选择器是什么?

    我正在寻找可用于访问子组件 DOM 元素的有效选择器的完整列表 ViewChild and ContentChild 说我有孩子HelloComponent 我知道我可以添加模板 ref并查询它 如下所示
  • chrome webrequest api url 数组?

    这是一个非常简单的 Chrome 扩展程序的代码 该扩展程序可以阻止手动指定的网站 chrome webRequest onBeforeRequest addListener function details return cancel t
  • 如何国际化/本地化 JSP/Servlet Web 应用程序?

    我从谷歌了解到 国际化是我可以使自己的 Web 应用程序使用所有语言 我想了解Unicode国际化的过程 所以我从here and there 我能够理解 Unicode 即字符集如何编码为字节 然后又如何将字节解码为字符集 但我不知道如何
  • android - CursorAdapter中两个视图布局的bindView和newView

    故事是这样的 我想在我的适配器中使用两种布局 所以基本上 我需要在 newView 中有一个 if 来确定要返回哪个视图 并在 bindView 中有一个 if 来知道在视图中做什么 这是正确的方法吗 我在想这样的事情 Override p
  • mysqli::bind_param();变量

    mysqli new mysqli localhost my user my password world check connection if mysqli connect errno printf Connect failed s n
  • 将位图转换为 ASCII 艺术图

    这样的图像转换算法是如何工作的 我想将位图转换为 ASCII 艺术 谁能帮我看看我应该使用哪种算法 W W W W W W W W W WW WW WW W WW WWW WW W W WW WWW WW W