利用Java制作字符动画实例代码

前言

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

正文

效果展示

原图,某两年半练习生

转成字符动画后的练习生

实现原理

其实字符动画的实现原理比较简单,这里我们抛开GIF,直接拿一张静态图片来说明。

首先我们要把原图转成灰度图,这样图片中每个像素就只存在亮度信息0-255。

取颜色的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输出即可。(视频同理)

由于完全自己处理的话,可能会有很多细节需要调整的地方,为了方便,这里推荐一个项目。Github地址:github.com/korhner/asc…  (本地下载)。使用方法:

// 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… (本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • java实现gif动画效果(java显示动态图片)

    就是每隔一定的时间显示一张图片,全部图片文件位于:"工作空间\项目名称\bin\动态图\花好月圆\"文件夹下.文件名类似:1001.jpg,1002.jpg,一直到1016.jpg: 复制代码 代码如下: /* * Donttai.java * * Created on __DATE__, __TIME__ */ package 动态图; import java.awt.Graphics;import java.awt.Image;import java.awt.image.Image

  • jQuery动画_动力节点节点Java学院整理

    用JavaScript实现动画,原理非常简单:我们只需要以固定的时间间隔(例如,0.1秒),每次把DOM元素的CSS样式修改一点(例如,高宽各增加10%),看起来就像动画了. 但是要用JavaScript手动实现动画效果,需要编写非常复杂的代码.如果想要把动画效果用函数封装起来便于复用,那考虑的事情就更多了. 使用jQuery实现动画,代码已经简单得不能再简化了:只需要一行代码! 让我们先来看看jQuery内置的几种动画样式: show / hide 直接以无参数形式调用show()和hide(

  • Java实现帧动画的实例代码

    本文讲述了Java实现帧动画的实例代码.分享给大家供大家参考,具体如下: 1.效果图 2.帧动画的简要代码 private ImageView bgAnimView; private AnimationDrawable mAnimationDrawable; //初始化 mAnimationDrawable = new AnimationDrawable(); bgAnimView = new ImageView(mContext); bgAnimView.setBackgroundDrawab

  • 利用Java制作字符动画实例代码

    前言 今晚闲来无事,整理了一下电脑中尘封已久的旧代码,看着那些年自己写过的代码,踩过的坑,顿时老泪纵横.正当在感叹之际,突然发现在"马克思"文件夹下出现了一个好玩的项目,那就是N年前刚学Java时写的GIF转字符动画的小玩具,虽然是个小玩意,但是在当时能搞点东西出来还是非常有成就感的. 正文 效果展示 原图,某两年半练习生 转成字符动画后的练习生 实现原理 其实字符动画的实现原理比较简单,这里我们抛开GIF,直接拿一张静态图片来说明. 首先我们要把原图转成灰度图,这样图片中每个像素就只

  • java判断各类型字符个数实例代码

    目录 描述 输入描述: 输出描述: 描述 输入一行字符串,分别统计出其中英文字母.空格.数字和其它字符的个数 输入描述: 控制台随机输入一串字符串 输出描述: 输出字符串中包含的英文字母个数,数字个数,空格个数,其它字符个数(格式为:英文字母x数字x空格x其他x),预设代码中已给出输出. import java.util.Scanner; public class Main { public static void main(String[] args) { int numbers = 0; i

  • 利用CSS制作3D动画

    目录 CSS 3D 基础知识 使用 transform-style 启用 3D 模式 利用 perspective & perspective-origin 设置 3D视距,实现透视/景深效果 通过绘制 Webpack Logo 熟悉 CSS 3D 实现文字的 3D 效果 3D 氖灯文字效果 利用 CSS 3D 配合 translateZ 实现真正的文字 3D 效果 利用距离.角度及光影构建不一样的 3D 效果 3D 计数器 空间效果 空间 3D 效果热身 利用图片素材 3D 无限延伸视角动画

  • 利用java制作一个小的目录查询器的方法

    实例如下: import java.util.*; import javax.swing.*; import java.awt.*; import java.io.*; import java.awt.event.*; class MyWindow{ private Frame f1; private Button bt1; private TextField tx1; private TextArea tx2; MyWindow(){ init(); } public void init(){

  • Java Web用户登录实例代码

    实现功能: 1.用户登陆.注销 2.利用session记录用户登陆信息 3.在JSP中展示已登陆用户信息 实现原理: 登陆后通过判断用户名和密码是否和存储的一致,如果一致,就把用户信息放到session中储存:如果不一致就提示信息,并且返回登陆页面. 显示信息页面上固定从session中找用户登陆信息,找到就显示用户信息,没找到就显示登陆框. 注销很简单,就是清空session信息. 主要文件: 1.LoginAction:struts2的Action类,用于处理JAVA端的主要登陆和登出逻辑.

  • Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_test.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import ja

  • Java上传视频实例代码

    页面: 上传文件时的关键词:enctype="multipart/form-data" <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://&qu

  • java fastdfs客户端使用实例代码

    本文研究的主要是java fastdfs客户端使用实例的相关内容,具体实现如下. 什么是FastDFS? FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务. FastDFS架构 FastDFS架构包括 Tracker server和Storage server.客户端请求Tracker server进行文件

  • Java中Console对象实例代码

    在JDK 6中新增了java.io.Console类,可以让您取得字节为基础的主控台装置,例如,您可以藉由System新增的console()方法取得标准输入输出装置的Console对象,并利用它来执行一些简单的主控台文字输入输出,例如: ConsoleDemo.java import java.io.Console; public class ConsoleDemo { public static void main(String[] args) { System.out.print("请输入

  • 利用Pygame制作简单动画的示例详解

    目录 前言 计时器 绘制精灵 加载精灵 完整代码 前言 实现一个帧动画,使用的一个图,根据不同的时间显示不同的图. 使用的就是如下所示的一张图,宽度780 * 300 ,使用加载图片 260 * 150来实现. pygame.init() screen = pygame.display.set_mode((400, 300), 0, 32) pygame.display.set_caption("动画") while True: for event in pygame.event.ge

随机推荐