Java打印任意字符串的字符画
首先看一下实现的效果:
注意:字符画的样式会根据选择字体的不同而不同,这里使用的是“幼圆”字体。
基本原理:主要原理是获取系统字库的字模信息,根据字模信息来画字符画。
基本思路:将字符串画到一张图片上,再获取图片每一个像素点的颜色值,根据像素点的值来判断是否需要打印字符。
实现思路:
- 根据输入的字符串和字体大小计算图片长宽;
- 根据计算出的长宽创建图片;
- 获取图片的画笔,设置背景为白色,画笔为黑色;
- 在图片上画出字符串;
- 获取图片的每个像素的RGB值;
- 最后通过判断每个像素点的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打印任意字符串的字符画相关推荐
- java 匹配最后一次出现的字符_在Java中查找字符串中字符的最后一次出现
使用该lastIndexOf()方法在Java中查找字符串中字符的最后一次出现. 假设以下是我们的字符串.String myStr = "Amit Diwan"; 在上面的字符串中 ...
- 打印给定字符串中字符的所有排列
题目: 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 解决: 简单起见,字符串中 ...
- [转载] 【Java】将一个字符串的字符排序,按ASCII表的顺序从小到大
参考链接: 在Java中搜索字符串中的字符和子字符串 将一个字符串的字符按ASCII表的顺序从小到大排序,如将字符串"asdafxcvMADb"排序为"ADMaabcdf ...
- java 打印ascii字符串_简单使用JAVA打印纯ASCII字符构成的酷图效果
简单地编写一个读取"ASCII-兔.txt"文件的java代码,如下所示: import java.io.BufferedReader; import java.io.File; ...
- ascii码java生成_Java 生成 ASCII 字符画 实现代码
ASCII码艺术是一种技术,它利用ASCII标 准中的可打印字符来产生视觉艺术效果.在历史上它有其存在的目的,当时的打印机还无法打印图片,并且当时在邮件中嵌入图像还无法实现,所以它也用于邮件 中.本文 ...
- js控制台 console 骚操作-打印图片-自定义样式-字符画
目录 控制台打印骚操作 自定义样式 打印(输出)图片 借助平台打印字符(符号组成) Lunicode 平台操作 图片转字符打印 控制台打印骚操作二 效果图 代码实现 错误案例 方式一(感觉有点乱) 方 ...
- Java获取任意字符串的首字母
/*** 取得给定汉字串的首字母串,即声母串** 注:只支持GB2312字符集中的汉字*/ /*** Description* Create by zhaoshuxiang* Date 2021/8/ ...
- Java打印任意一年的日历
用Java循环知识打印一个日历 打印一年的年历:编写程序提示用户从键盘上输入一个年份(如2021)和该年第一天是星期几,星期用数字表示,0表示星期日,如图: 代码如下: 用ans变量存储个数,如果等于 ...
- [Java基础]判断字符串指定字符类型
Character.isDigit(string.charAt(index)) //如果index位置的字符是数字 返回true Character.isLetter(string.charAt(i ...
最新文章
- python矩阵处理库_用于处理非常大的矩阵的Python库
- iOS设计模式 - 生成器
- 北京理工大学信息安全与对抗竞赛----crackme02分析
- 模板打印:代码实现和总结
- Openshift:使用Java 8在Wildfly 8.2.0上构建Spring Boot应用程序
- java中正则表达式
- 非空约束 mysql
- 小米10预计春节后见 售价超3500元没悬念
- ORACLE SQL分组查询某列或某几列重复信息数量
- 【实用工具】一键在线抠图、一键在线更换图片背景、一键更换证件照片背景颜色的神奇AI网站 RemoveBg
- Python爬虫爬取淘宝天猫,处理url正确的解码方法
- 计算机语言中beta是什么意思,Tea语言迎来1.0第一个Beta版本
- c语言指针一步错步步错,一步错步步错,可是到底错在哪里
- 计算机省二打字,巧用音频转文字,省去打字烦恼
- 姨搜侯松:信贷场景全流程数据风控体系
- 【微信小程序提取公共请求数据】
- 牛顿迭代法例题 matlab,牛顿迭代法-matlab程序(解线性方程组)
- 求无序数组的第K(大/小)数的三种方法
- 绝不错过:各省驻京办秘制招牌菜!
- 软考考试多少分可以拿到证书?