首先看一下实现的效果:

注意:字符画的样式会根据选择字体的不同而不同,这里使用的是“幼圆”字体。

基本原理:主要原理是获取系统字库的字模信息,根据字模信息来画字符画。

基本思路:将字符串画到一张图片上,再获取图片每一个像素点的颜色值,根据像素点的值来判断是否需要打印字符。

实现思路:

  1. 根据输入的字符串和字体大小计算图片长宽;
  2. 根据计算出的长宽创建图片;
  3. 获取图片的画笔,设置背景为白色,画笔为黑色;
  4. 在图片上画出字符串;
  5. 获取图片的每个像素的RGB值;
  6. 最后通过判断每个像素点的RGB值来打印字符画。

代码实现:

import java.awt.*;
import java.awt.image.*;
import java.util.*;public class Print {public static final int FONT_SIZE = 16;public static final Font font = new Font("幼圆", Font.PLAIN, FONT_SIZE);public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("输入填充的字符(默认为 #):");String symbol = scanner.nextLine().trim();symbol = symbol.isEmpty() ? "#" : symbol.substring(0, 1);System.out.print("请输入空白处填充的字符(默认为空格):");String fill = scanner.nextLine().trim();fill = fill.isEmpty() ? " " : fill.substring(0, 1);while (true) {System.out.print("请输入需要打印的字符串(Ctrl+D退出):");String str = scanner.nextLine().trim();print(str, symbol, fill);}}private static void print(String str, String symbol, String fill) {// 输入字符为空则直接返回if (str.isEmpty()) return;// 通过字符串长度和字体大小计算图片宽度int imageWidth = str.length() * FONT_SIZE;// 图片高度,需要余留几个像素,因为有些字符像','会有一部分低于基准线int imageHeight = FONT_SIZE + 2;// 获取rgb值的数组int[] rgbArray = getRGBArrayFromImage(str, imageWidth, imageHeight);// 遍历每个像素,判断是否需要输出字符for (int i = 0; i < imageHeight; i++)for (int j = 0; j < imageWidth; j++)System.out.print((rgbArray[i * imageWidth + j] == Color.BLACK.getRGB() ? symbol : fill) + (j == imageWidth - 1 ? "\n" : ""));}private static int[] getRGBArrayFromImage(String str, int imageWidth, int imageHeight) {// 创建图片BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);// 获取图片的画笔Graphics2D graphics = image.createGraphics();// 设置背景为白色graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, imageWidth, imageHeight);// 设置画笔为黑色graphics.setColor(Color.BLACK);// 设置字体graphics.setFont(font);// 在图片上画出字符串graphics.drawString(str, 0, imageHeight - 2);// 获取rgb值的数组并返回return image.getRGB(0, 0, imageWidth, imageHeight, new int[imageHeight * imageWidth], 0, imageWidth);}
}

感谢第28楼@zapdos大佬的解决方法:https://bbs.csdn.net/topics/210039216?

Java打印任意字符串的字符画相关推荐

  1. java 匹配最后一次出现的字符_在Java中查找字符串中字符的最后一次出现

    使用该lastIndexOf()方法在Java中查找字符串中字符的最后一次出现. 假设以下是我们的字符串.String myStr = "Amit Diwan"; 在上面的字符串中 ...

  2. 打印给定字符串中字符的所有排列

    题目: 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 解决: 简单起见,字符串中 ...

  3. [转载] 【Java】将一个字符串的字符排序,按ASCII表的顺序从小到大

    参考链接: 在Java中搜索字符串中的字符和子字符串 将一个字符串的字符按ASCII表的顺序从小到大排序,如将字符串"asdafxcvMADb"排序为"ADMaabcdf ...

  4. java 打印ascii字符串_简单使用JAVA打印纯ASCII字符构成的酷图效果

    简单地编写一个读取"ASCII-兔.txt"文件的java代码,如下所示: import java.io.BufferedReader; import java.io.File; ...

  5. ascii码java生成_Java 生成 ASCII 字符画 实现代码

    ASCII码艺术是一种技术,它利用ASCII标 准中的可打印字符来产生视觉艺术效果.在历史上它有其存在的目的,当时的打印机还无法打印图片,并且当时在邮件中嵌入图像还无法实现,所以它也用于邮件 中.本文 ...

  6. js控制台 console 骚操作-打印图片-自定义样式-字符画

    目录 控制台打印骚操作 自定义样式 打印(输出)图片 借助平台打印字符(符号组成) Lunicode 平台操作 图片转字符打印 控制台打印骚操作二 效果图 代码实现 错误案例 方式一(感觉有点乱) 方 ...

  7. Java获取任意字符串的首字母

    /*** 取得给定汉字串的首字母串,即声母串** 注:只支持GB2312字符集中的汉字*/ /*** Description* Create by zhaoshuxiang* Date 2021/8/ ...

  8. Java打印任意一年的日历

    用Java循环知识打印一个日历 打印一年的年历:编写程序提示用户从键盘上输入一个年份(如2021)和该年第一天是星期几,星期用数字表示,0表示星期日,如图: 代码如下: 用ans变量存储个数,如果等于 ...

  9. [Java基础]判断字符串指定字符类型

    Character.isDigit(string.charAt(index)) //如果index位置的字符是数字  返回true Character.isLetter(string.charAt(i ...

最新文章

  1. python矩阵处理库_用于处理非常大的矩阵的Python库
  2. iOS设计模式 - 生成器
  3. 北京理工大学信息安全与对抗竞赛----crackme02分析
  4. 模板打印:代码实现和总结
  5. Openshift:使用Java 8在Wildfly 8.2.0上构建Spring Boot应用程序
  6. java中正则表达式
  7. 非空约束 mysql
  8. 小米10预计春节后见 售价超3500元没悬念
  9. ORACLE SQL分组查询某列或某几列重复信息数量
  10. 【实用工具】一键在线抠图、一键在线更换图片背景、一键更换证件照片背景颜色的神奇AI网站 RemoveBg
  11. Python爬虫爬取淘宝天猫,处理url正确的解码方法
  12. 计算机语言中beta是什么意思,Tea语言迎来1.0第一个Beta版本
  13. c语言指针一步错步步错,一步错步步错,可是到底错在哪里
  14. 计算机省二打字,巧用音频转文字,省去打字烦恼
  15. 姨搜侯松:信贷场景全流程数据风控体系
  16. 【微信小程序提取公共请求数据】
  17. 牛顿迭代法例题 matlab,牛顿迭代法-matlab程序(解线性方程组)
  18. 求无序数组的第K(大/小)数的三种方法
  19. 绝不错过:各省驻京办秘制招牌菜!
  20. 软考考试多少分可以拿到证书?

热门文章

  1. VB 与 Windows API 讲座(叁)转载
  2. Loop subdivision(循环细分) modify butterfly subdivision(改进的蝴蝶细分)算法实现
  3. HTC G7之A2SD+
  4. python count函数代码_python count函数用法详解_后端开发
  5. MySQL社区版源码安装
  6. 迅雷赢了,QQ旋风宣布关闭
  7. 【站长SEO助手】浏览器插件 - seo工具
  8. libreOffice构建docker镜像
  9. 新宝综述指数回调行情与昨日相反
  10. MATLAB 制作一个圆的模板