图片转字符图片(一)
序言
这个是从抖音上学来的,一开始刷抖音,遇到不少字符串跳舞的视频,因此来实践一下
主要分为三个部分
- 静态图片转静态图片
- gif 转 gif
- 视频转视频
静态图片转静态图片
其实原理很简单,读取图片的像素,新建一张大小一样的图片,根据原图像素的灰度,决定是不是要显示出来,并在新图相应的位置添加字符,这样就完成了
借助前辈写的工具,主要包含一下四个类:
AnimatedGifEncoder
GifDecoder
LZWEncoder
NeuQuant
源地址
https://github.com/rtyley/animated-gif-lib-for-java
ps: 网上各种版本的太多,不清楚这个是不是原作者,github上搜GifDecoder,有不少
环境:
JDK 1.8
注:Java原生代码实现使用jdk内部的GIFImageReader、GIFImageWriter等类,maven在编译的时候会提示这是sun公司的私有API,在1.7、1.8版的JDK中已经删除,所以是有风险的。在此使用ImageIO这个类来进行图片的操作。
主要代码如下所示:
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.imageio.ImageIO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @ClassName: ImgUtil * @Description: TODO * @author jiang * @date 2018年8月14日 下午10:15:56 * */ public class ImgUtil { static Logger logger = LoggerFactory.getLogger(ImgUtil.class); public static boolean toTextImg(String inputFile, String outputFile, final String base, int threshold) { // String blackFile = "F:/123/head_black.png"; BufferedImage src = null; BufferedImage tag = null; boolean res = false; try { src = ImageIO.read(new FileInputStream(inputFile)); int[] rgb = new int[3]; int width = src.getWidth(); int height = src.getHeight(); int minx = src.getMinX(); int miny = src.getMinY(); // 黑白化 /*- src = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null).filter(src, null); res = ImageIO.write(src, blackFile.substring(blackFile.lastIndexOf(".") + 1), new File(blackFile)); src = ImageIO.read(new FileInputStream(blackFile));*/ tag = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); Graphics g = tag.getGraphics(); g.setFont(new Font("微软雅黑", Font.PLAIN, 10));// 设置字体 g.setColor(Color.BLUE);// 设置颜色 for (int x = minx; x < width; x += 6) { for (int y = miny; y < height; y += 6) { int pixel = src.getRGB(x, y); // 下面三行代码将一个数字转换为RGB数字 rgb[0] = (pixel & 0xff0000) >> 16;// red rgb[1] = (pixel & 0xff00) >> 8;// green rgb[2] = (pixel & 0xff);// blue final float gray = 0.299f * rgb[0] + 0.578f * rgb[1] + 0.114f * rgb[2]; final int index = Math.round(gray * (base.length() + 1) / 255); // logger.debug("{},{}",index,base.length() / threshold); if (index <= threshold) { g.drawString(String.valueOf(base.charAt(index % base.length())), x, y);// 文字的编写及位置 } /*- if (rgb[0] + rgb[1] + rgb[2] <= 500) { System.out.println("i=" + i + ",j=" + j + ":(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")"); g.drawString("v", i, j);// 文字的编写及位置 }*/ } } g.dispose(); // 输出图片 res = ImageIO.write(tag, outputFile.substring(outputFile.lastIndexOf(".") + 1), new File(outputFile)); logger.debug("字符化结果:{}", res); } catch (IOException e) { logger.error("err", e); return false; } return true; } }
代码的思路很简单,src.getRGB(x, y)
获取具体像素点的颜色值,共六位,每两位一个颜色值,依次是red
green
blue
,类似的使用(pixel & 0xff0000) >> 16
获取第一位的红色等,根据灰度公式Gray = R*0.299 + G*0.587 + B*0.114
计算灰度(百度颜色灰度公式
,有很多来计算心理灰度的解决方案),选择合适的灰度替换上合适的字符即可
源码地址:
https://github.com/Ruffianjiang/java4fun/tree/master/img2text
参考:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
CodeMirror 代码渲染神器的极简入门实例
效果: image.png HTML: <script src="https://codemirror.net/lib/codemirror.js"></script> <script src="https://codemirror.net/mode/javascript/javascript.js"></script> <link rel="stylesheet" href="https://codemirror.net/lib/codemirror.css"> <div id="fn"></div> <button class="btn btn-sm btn-success offset2" id="fn-save-btn">保存</button> <button class="btn btn-sm btn-success" id="fn-eval-btn">运行</button> <div id="eval-result" class="eva...
- 下一篇
图片转字符图片(二)
序言 这个是从抖音上学来的,一开始刷抖音,遇到不少字符串跳舞的视频,因此来实践一下 主要分为三个部分 静态图片转静态图片 gif 转 gif 视频转视频 gif 转 gif 原理和静态图片的转换类似,这个需要每一帧的去转换。一开始的思路是把gif的每一帧转为图片,然后对图片进行转换,最后合成 gif 。 研究了 im4java,参考: https://blog.csdn.net/DamonRush/article/details/51746995、https://blog.csdn.net/weiwangchao_/article/details/46520571, 还有一些其他的工具(用了私有api,不推荐) http://zhaorui1125.iteye.com/blog/2116816, 最后发现他们截出来的每一张图要么发红,要么模糊,只好放弃了。最后发现不需要把每一帧都保存下来,临时存一下就好,具体代码如下: 环境: JDK 1.8 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; i...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境