【轻松一刻】Java制做字符动画

前言

今晚闲来无事,整理了一下电脑中尘封已久的旧代码,看着那些年本身写过的代码,踩过的坑,顿时老泪纵横。正当在感叹之际,忽然发如今“马克思”文件夹下出现了一个好玩的项目,那就是N年前刚学Java时写的GIF转字符动画的小玩具,虽然是个小玩意,可是在当时能搞点东西出来仍是很是有成就感的。java

正文

效果展现

原图,某两年半练习生git

转成字符动画后的练习生github

实现原理

其实字符动画的实现原理比较简单,这里咱们抛开GIF,直接拿一张静态图片来讲明。
首先咱们要把原图转成灰度图,这样图片中每一个像素就只存在亮度信息0-255。markdown

取颜色的RGB均值灰度后异步

接着咱们能够定义须要使用的字符,每一个字符对应一段亮度范围,好比 图中的M,@,;等字符,接着咱们就能够去遍历替换图片中的全部像素,慢慢的调试每一个字符对应像素的亮度范围,调试到输出的图像轮毂清晰便可,这样单张图片的字符画就已经成型了。下面关键代码注释。工具

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
		int width = bi.getWidth();//原图宽度
		int height = bi.getHeight();//原图高度
		int minx = bi.getMinX();//BufferedImage 原图 最小X坐标
		int miny = bi.getMinY(); //BufferedImage 原图 最小Y坐标
		for (int i = miny; i < height; i += 8) {//遍历图片中的像素点,用字符判断像素范围来替换
			for (int j = minx; j < width; j += 8) {
				int pixel = bi.getRGB(j, i); // 下面三行代码将一个数字转换为RGB数字
				int red = (pixel & 0xff0000) >> 16;
				int green = (pixel & 0xff00) >> 8;
				int blue = (pixel & 0xff);
				double gray = 0.299 * red + 0.578 * green + 0.114 * blue; //图片变灰计算公式
				char c = toChar((int) gray); //根据计算出来的gray值返回不一样字符
				bufferedWriter.write(c);
			}
			bufferedWriter.newLine();
		}
		//输出图片
复制代码

若要读取GIF,输出GIF,咱们可使用一些开源的包,例如animated-gif,GifDecoder等,经过这些类咱们能够读取到gif的每一帧,而后咱们对每一帧的操做都跟上方的静态图操做是一致的。处理完每一帧以后再合成GIF输出便可。(视频同理)oop

因为彻底本身处理的话,可能会有不少细节须要调整的地方,为了方便,这里推荐一个项目。Github地址:github.com/korhner/asc… 。使用方法:post

// initialize caches
AsciiImgCache smallFontCache = AsciiImgCache.create(new Font("Courier",Font.BOLD, 6));
// initialize ssimStrategy
BestCharacterFitStrategy ssimStrategy = new StructuralSimilarityFitStrategy();

String srcFilePath = "examples/xxx.gif";
String disFilePath = "examples/xxx.gif";
int delay = 100;//ms

GifToAsciiConvert asciiConvert = new GifToAsciiConvert(smallFontCache, ssimStrategy);

asciiConvert.convertGitToAscii(srcFilePath, disFilePath, delay,0);
复制代码

只须要简单的几行,就能够完成字符动画的转换,其原理跟咱们上面介绍的基本一致,有兴趣的同窗能够自行研究。优化

结语

代码除了用来工做,其实还能用在不少能让咱们开心的地方,例如写点小工具,小游戏,帮本身或他人解决一些繁琐的事情,这样才能在工做多年后任然保持对代码的那份初心,不至于被重复的工做磨灭了激情。动画


公众号博文同步Github仓库,有兴趣的朋友能够帮忙给个Star哦,码字不易,感谢支持。

github.com/PeppaLittle…

推荐阅读

如何优化代码中大量的if/else,switch/case?
如何提升使用Java反射的效率?
Java日志正确使用姿式
大白话搞懂什么是同步/异步/阻塞/非阻塞

有收获的话,就点个赞吧

关注「深夜里的程序猿」,分享最干的干货

相关文章
相关标签/搜索