为什么80%的码农都做不了架构师?>>>

最近抖音上挺火的一个小把戏,在记事本打开,一整篇的乱码字符,然后进过调整之后,出现一张由各种字符组成的黑白照片。先看一个效果图

微信小程序体验

 直接体验请微信扫码

选择图片转字符图片

 接下来我们就用Java来实现吧。

需要用到的工具类代码

https://gitee.com/xshuai/ai/blob/master/AIDemo/src/main/java/com/xs/util/image/AnimatedGifEncoder.java

https://gitee.com/xshuai/ai/blob/master/AIDemo/src/main/java/com/xs/util/image/LZWEncoder.java

https://gitee.com/xshuai/ai/blob/master/AIDemo/src/main/java/com/xs/util/image/NeuQuant.java

单独的项目地址

https://gitee.com/xshuai/imagetool

本项目使用的公式为: Gray = R*0.299 + G*0.587 + B*0.114

更多RGB色转灰度可以访问:https://blog.csdn.net/xdrt81y/article/details/8289963

非闪图图片转字符画到记事本

package com.xs.util.image;import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;import javax.imageio.ImageIO;import com.xs.util.image.other.ImageHelper;
/*** Image2ASCII* @author 小帅丶* 2018年8月14日*/
public class Image2ASCII{static String ascii = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\\\"^`'.";static String base = "@#&$%*o!;.";//小帅丶使用这个字符//main方法调用public static void main(String[] args) throws Exception {load("G:/phone.jpg", "F:/gif/woman.txt");//静态图片转字符保存为txt文件}/*** 图片转字符* @param imagePath 图片路径 * @param txtPath 文本存放路径* @throws IOException*/public static void load(String imagePath, String txtPath)throws IOException {BufferedImage image = ImageHelper.resize(ImageIO.read(new File(imagePath)),150,150);load(image, txtPath);}/*** 图片转字符* @param bi BufferedImage图片 * @param txtPath 文本存放路径* @throws IOException*/public static void load(BufferedImage bi, String txtPath)throws IOException {try {int width = bi.getWidth();int height = bi.getHeight();boolean flag = false;String result = "";for (int i = 0; i < height; i += 2) {for (int j = 0; j < width; j++) {int pixel = bi.getRGB(j, i); // 下面三行代码将一个数字转换为RGB数字int red = (pixel & 0xff0000) >> 16;int green = (pixel & 0xff00) >> 8;int blue = (pixel & 0xff);float gray = 0.299f * red + 0.578f * green + 0.114f * blue;int index = Math.round(gray * (base.length() + 1) / 255);result += index >= base.length() ? " " : String.valueOf(base.charAt(index));}result += "\r\n";}flag = writeTxtFile(result,txtPath);//保存字符到文本文件System.out.println(flag?"图片转字符保存成功":"图片转字符保存失败");} catch (Exception e) {System.out.println("图片转字符异常"+e.getMessage());}}/*** 字符保存到txt文件中 * @param imageStr 字符* @param txtPath  txt文件* @return boolean* @throws Exception*/private static boolean writeTxtFile(String imageStr, String txtPath) throws Exception{// 先读取原有文件内容,然后进行写入操作boolean flag = false;String filein = imageStr;String temp = "";FileInputStream fis = null;InputStreamReader isr = null;BufferedReader br = null;FileOutputStream fos = null;PrintWriter pw = null;try {// 文件路径File file = new File(txtPath);if (!file.exists()) {file.createNewFile();}// 将文件读入输入流fis = new FileInputStream(file);isr = new InputStreamReader(fis);br = new BufferedReader(isr);StringBuffer buf = new StringBuffer();// 保存该文件原有的内容for (int j = 1; (temp = br.readLine()) != null; j++) {buf = buf.append(temp);}buf.append(filein);fos = new FileOutputStream(file);pw = new PrintWriter(fos);pw.write(buf.toString().toCharArray());pw.flush();flag = true;} catch (IOException e) {System.out.println("文件保存失败"+e.getMessage());} finally {if (pw != null) {pw.close();}if (fos != null) {fos.close();}if (br != null) {br.close();}if (isr != null) {isr.close();}if (fis != null) {fis.close();}}return flag;}
}

非闪图图片转字符画返回BASE64

直接保存为图片也可以。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;import javax.imageio.ImageIO;import sun.misc.BASE64Encoder;/*** Image2ASCII* @author 小帅丶* 2018年8月14日*/
public class Image2ASCII{static String ascii = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\\\"^`'.";static String base = "@#&$%*o!;.";//小帅丶使用这个字符/** 图片类型  */private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_RGB;/*** 图片转字符再保存为图片 只返回图片的base64* @param bi 原图* @param outPutPath* @return String*/public static String txtToImageByBase64(BufferedImage bi) {System.out.println("进来的时间"+System.currentTimeMillis());int width = bi.getWidth();int height = bi.getHeight();int minx = bi.getMinX();int miny = bi.getMinY();int speed = 7;BufferedImage bufferedImage = new BufferedImage(width,height,IMAGE_TYPE);// 获取图像上下文Graphics g = createGraphics(bufferedImage, width, height, speed);// 图片中文本行高final int Y_LINEHEIGHT = speed;int lineNum = 1;for (int i = miny; i < height; i += speed) {for (int j = minx; j < width; j += speed) {int pixel = bi.getRGB(j, i); // 下面三行代码将一个数字转换为RGB数字int red = (pixel & 0xff0000) >> 16;int green = (pixel & 0xff00) >> 8;int blue = (pixel & 0xff);float gray = 0.299f * red + 0.578f * green + 0.114f * blue;int index = Math.round(gray * (base.length() + 1) / 255);String c = index >= base.length() ? " " : String.valueOf(base.charAt(index));g.drawString(String.valueOf(c), j, i);}lineNum++;}g.dispose();ByteArrayOutputStream out = new ByteArrayOutputStream();try {ImageIO.write(bufferedImage,"jpg",out);BASE64Encoder base64Encoder = new BASE64Encoder();String base64 =base64Encoder.encode(out.toByteArray());return base64;} catch (IOException e) {System.out.println("ImageIO.write异常" + e.getMessage());}finally{if(null!=out){try {out.close();} catch (IOException e) {System.out.println("out.close()异常" + e.getMessage());}}}return null;}/*** 画板默认一些参数设置* @param image 图片* @param width 图片宽* @param height 图片高* @param size 字体大小* @return*/private static Graphics createGraphics(BufferedImage image, int width,int height, int size) {Graphics g = image.createGraphics();g.setColor(null); // 设置背景色g.fillRect(0, 0, width, height);// 绘制背景g.setColor(Color.BLACK); // 设置前景色g.setFont(new Font("微软雅黑", Font.PLAIN, size)); // 设置字体return g;}
}

效果图

方法返回的为图片的base64数据。格式为jpg。加头信息即可在img标签的src中显示图片哦。

在线转base64为图片 需要加头信息 data:image/jpg;base64,

http://imgbase64.duoshitong.com/

闪图图片转字符画返回图片

package com.xs.util.image;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.FileImageInputStream;import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.imageio.plugins.gif.GIFImageReader;
import com.sun.imageio.plugins.gif.GIFImageReaderSpi;import sun.misc.BASE64Encoder;/*** Image2ASCII* @author 小帅丶* 2018年8月14日*/
public class Image2ASCII{static String ascii = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\\\"^`'.";static String base = "@#&$%*o!;.";//小帅丶使用这个字符/** 图片类型  */private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_RGB;/*** gif图片转gif字符图* @param imagePath 原图路径* @param outPath  输出图片的文件夹路径* @throws IOException*/public static void loadGif(String imagePath, String outPath)throws IOException {File imageFile = new File(imagePath);FileImageInputStream in = new FileImageInputStream(imageFile);ImageReaderSpi readerSpi = new GIFImageReaderSpi();GIFImageReader gifImageReader = new GIFImageReader(readerSpi);gifImageReader.setInput(in);int num = gifImageReader.getNumImages(true);System.out.println(num);BufferedImage[] bufferedImages = new BufferedImage[num];for (int i = 0; i < num; i++) {BufferedImage bi = gifImageReader.read(i);bufferedImages[i] = txtToImage(bi, outPath + "out" + i + ".jpeg"); //每一帧都保存为图片}jpgToGif(bufferedImages,outPath + imagePath.substring(imagePath.length() - 6)+ "outGif.gif", 200);}/*** 图片转字符再保存为图片* @param bi 原图* @param outPutPath* @return BufferedImage*/public static BufferedImage txtToImage(BufferedImage bi, String outPutPath) {File imageFile = new File(outPutPath);if (!imageFile.exists()) {try {imageFile.createNewFile();} catch (IOException e) {e.printStackTrace();}}int width = bi.getWidth();int height = bi.getHeight();int minx = bi.getMinX();int miny = bi.getMinY();System.out.println(width + " " + height);int speed = 7;BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);// 获取图像上下文Graphics g = createGraphics(bufferedImage, width, height, speed);// 图片中文本行高final int Y_LINEHEIGHT = speed;int lineNum = 1;for (int i = miny; i < height; i += speed) {for (int j = minx; j < width; j += speed) {int pixel = bi.getRGB(j, i); // 下面三行代码将一个数字转换为RGB数字int red = (pixel & 0xff0000) >> 16;int green = (pixel & 0xff00) >> 8;int blue = (pixel & 0xff);float gray = 0.299f * red + 0.578f * green + 0.114f * blue;int index = Math.round(gray * (base.length() + 1) / 255);
//              char c = ascii.charAt((int) (gray / 255 * ascii.length()));
//              char c = toChar((int) gray);
//              char c = toChar(index);String c = index >= base.length() ? " " : String.valueOf(base.charAt(index));g.drawString(String.valueOf(c), j, i);}lineNum++;}g.dispose();// 保存为jpg图片FileOutputStream fos;try {fos = new FileOutputStream(imageFile);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);OutputStream out = encoder.getOutputStream();BASE64Encoder base64Encoder = new BASE64Encoder();encoder.encode(bufferedImage);fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (ImageFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bufferedImage;}/*** 画板默认一些参数设置* @param image 图片* @param width 图片宽* @param height 图片高* @param size 字体大小* @return*/private static Graphics createGraphics(BufferedImage image, int width,int height, int size) {Graphics g = image.createGraphics();g.setColor(null); // 设置背景色g.fillRect(0, 0, width, height);// 绘制背景g.setColor(Color.BLACK); // 设置前景色g.setFont(new Font("微软雅黑", Font.PLAIN, size)); // 设置字体return g;}/*** n张jpg转gif方法  * @param bufferedImages* @param newPic* @param playTime*/private static void jpgToGif(BufferedImage[] bufferedImages, String newPic,int playTime) {try {AnimatedGifEncoder e = new AnimatedGifEncoder();e.setRepeat(0);e.start(newPic);for (int i = 0; i < bufferedImages.length; i++) {e.setDelay(playTime); // 设置播放的延迟时间e.addFrame(bufferedImages[i]); // 添加到帧中}e.finish();} catch (Exception e) {System.out.println("jpgToGif Failed:");}}
}

调用代码

public static void main(String[] args) throws Exception {loadGif("C:/Users/Administrator/Desktop/页面录屏显示.gif", "F:/gif/");//动图转为动态的字符图片}

返回的图片效果原图为小程序演示闪图

转载于:https://my.oschina.net/xshuai/blog/1927629

抖音神器---Java实现图片(Image)转字符(ASCII)图片相关推荐

  1. 带你了解抖音神器---Java实现图片(Image)转字符(ASCII)图片!

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 最近抖音上挺火的一个小把戏,在记事本打开,一整篇的乱码字符,然后进过调整之后,出现一张由各种字符组成的黑白照片.先看一个效果图  接 ...

  2. Java实现图片(Image)转字符(ASCII)图片

    最近抖音上挺火的一个小把戏,在记事本打开,一整篇的乱码字符,然后进过调整之后,出现一张由各种字符组成的黑白照片.先看一个效果图 微信小程序体验 直接体验请微信扫码 选择字符图片  接下来我们就用Jav ...

  3. 仿抖音短视频系统源码,获取系统图片

    仿抖音短视频系统源码,实现获取系统图片的相关代码如下: 首先开权限 <uses-permission android:name="android.permission.WRITE_EX ...

  4. 蚂蚁金服 + 拼多多 + 抖音 + 天猫 Java 面经合集,金九yings

    前言 很多 Java 开发者面试之前,可能没有较长的工作时间或者较为丰富的工作经验,所以不知道互联网公司或者一线互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试 ...

  5. 抖音 Android 性能优化系列:Java 内存优化篇

    内存作为计算机程序运行最重要的资源之一,需要运行过程中做到合理的资源分配与回收,不合理的内存占用轻则使得用户应用程序运行卡顿.ANR.黑屏,重则导致用户应用程序发生 OOM(out of memory ...

  6. 抖你妹原版主题源码 仿抖音模式套图SEO源码 全开源无授权 WordPress图片主题

    靓图库模板抖你妹原版主题源码,仿抖音模式套图SEO源码,wordpress图片主题不送数据!此源码为wordpress模板,需先安装wordpress后才能使用! 注意:PHP版本越高越好,PHP必须 ...

  7. 在刀尖舞蹈的今日头条,为什么要冒险“催熟”抖音?

    最近的中国互联网充满了血腥味. 一边是出行市场的巨头与独角兽之争,一边是以抖音为代表的头条系在整个内容+社交领域的疯狂厮杀. 最近最常见的口径是,"抖音用500天挤走快手".&qu ...

  8. 原来“抖商大会”和抖音没有关系!抖音起诉“抖商大会”主办方 索赔300万

    近年来,随着抖音等一系列短视频软件在全国范围内的火爆,带动了全民短视频的风潮.抖音还进军了海外,在海外市场也有不小的影响力,给今日头条打了一场漂亮的胜仗,也是字节跳动最为成功的产品之一. 图片来源于网 ...

  9. 在抖音里怎么快速涨粉,抖音视频怎么发最容易上热门

    在抖音里怎么快速涨粉,抖音视频怎么发最容易上热门 新人运营抖音短视频,在试错期结束后要注意内容创作的标准化. 在抖音里怎么涨粉?抖音的形式从短视频变为直播.图片.长视频:变现形式也从广告扩展到直播.电 ...

最新文章

  1. SPAdes混合组装二代、三代测序数据
  2. OpenCV方向梯度直方图HOG的实例(附完整代码)
  3. python 脚本防破解-pyd编译-python27+win7-64环境
  4. CodeForces - 487B Strip(线段树+dp+二分)
  5. SAP Fiori Application Generator 在 Visual Studio Code 启动时遇到的错误消息
  6. C# socket nat 映射 网络 代理 转发
  7. [Case] “凭心而论,在这家公司很敬业的工作了3年多,老板最后给我下的评语,大家都看看吧,千万别和我走同一条路!”(摘自csdn)...
  8. gitlab php自动化测试,自动化发布-GitLab WEB Hooks 配置
  9. 无法连接网络的解决办法
  10. 如何打造一个自动化的前端项目
  11. 计算机怎样使操作家长控制,孩子自制力差 电脑设置家长控制技巧图文详细教程...
  12. 制作一个简单的大数据看板(FineReport-帆软)
  13. 2019年保研夏令营时间经验汇总
  14. cgroup v2介绍及测试
  15. 【转载】Cygwin安装
  16. 解决vnc客户端不能拷贝粘贴
  17. 毕业生--参考文献查询网站及方法(中文核心及以上)
  18. legend位置 pyecharts_pyecharts在手,天下我有(常用图表篇上)
  19. 库存转换是什么意思_什么是库存?
  20. ProgressBar进度条(圆形进度条|水平进度条)

热门文章

  1. 云和恩墨大讲堂·武汉站圆满落幕,矢志不移再出发(附演讲PPT下载)
  2. pap.er - Mac必备5K壁纸下载软件
  3. rocketdock 修改隐藏快捷键
  4. 自适应旁瓣matlab,相控阵雷达自适应旁瓣对消技术的研究
  5. iOS-Undefined symbols for architecture x86_64-- 调适萤石摄像头驱动程序--萤石开放平台
  6. Spring的IOC原理以及思维导图
  7. Xcode7 真机调试(无需证书)详解
  8. STM32程序烧录---TTL
  9. vue实现打开网页自动播放音乐
  10. ML-常见目标检测算法