Jav文件压缩-InputStream转化为base64-Base64解码并生成图片

直接上源码,解释见文章尾部

 package com.hs.common.util.imgecode;

 import com.hs.common.util.Logger;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*; public class ImageEncodeUtil {
private final static Logger logger = Logger.getLogger(ImageEncodeUtil.class); //1-压缩图片
public static InputStream compressFile(InputStream input) throws IOException {
//1-压缩图片
BufferedImage bufImg = ImageIO.read(input);// 把图片读入到内存中
bufImg = Thumbnails.of(bufImg).width(100).keepAspectRatio(true).outputQuality(0.2f).asBufferedImage();//压缩:宽度100px,长度自适应;质量压缩到0.1
ByteArrayOutputStream bos = new ByteArrayOutputStream();// 存储图片文件byte数组
ImageIO.write(bufImg, "jpg", bos); // 图片写入到 ImageOutputStream
input = new ByteArrayInputStream(bos.toByteArray());
int available = input.available();
//2-如果大小超过50KB,继续压缩
if(available > 50000){
compressFile(input);
}
return input; }
//2-InputStream转化为base64
public static String getBase64FromInputStream(InputStream in) {
// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
byte[] data = null;
// 读取图片字节数组
try {
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = in.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
data = swapStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String str = new String(Base64.encodeBase64(data));
System.out.println( "str length: " + str.length() + " str: " + str);
return str;
} //3-Base64解码并生成图片
public static boolean GenerateImage(String base64str,String savepath) { //对字节数组字符串进行Base64解码并生成图片
if (base64str == null) //图像数据为空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
//Base64解码
byte[] b = decoder.decodeBuffer(base64str);
// System.out.println("解码完成");
70 for (int i = 0; i < b.length; ++i) {
71 if (b[i] < 0) {//调整异常数据(这一步很重要)
72 b[i] += 256;
73 }
74 }
//生成jpeg图片
OutputStream out = new FileOutputStream(savepath);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
} public static void main(String[] args) {
try {
File file = new File("C:\\Users\\tyj\\Desktop\\01.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
InputStream inputStream = compressFile(fileInputStream);
String base64FromInputStream = getBase64FromInputStream(inputStream);
GenerateImage(base64FromInputStream,"C:\\\\Users\\\\tyj\\\\Desktop\\\\113001.jpg");
InputStream is =new ByteArrayInputStream(base64FromInputStream.getBytes("UTF-8"));
System.out.println("compress success");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

1.图片压缩使用谷歌thumbnailator,详情可参考:https://www.cnblogs.com/ken-jl/p/8847567.html

        <!-- 谷歌图片压缩 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>

2-InputStream转化为base64

3-Base64解码并生成图片,注意其中的标红部分,调整异常数据(这一步很重要)

项目总结13:Jav文件压缩-InputStream转化为base64-Base64解码并生成图片的更多相关文章

  1. 文件压缩小项目haffman压缩

    文件压缩的原理: 文件压缩总体可以分为有损压缩和无损压缩两类,有损压缩是指对mp3等格式的文件,忽略一些无关紧要的信息,只保留一些关键的信息,但并不因此影响用户对于这些mp3格式文件的体验度,无损压缩 ...

  2. 3D性能优化 | 说一说glTF文件压缩

    引言 最近做T级互动,需要使用到3D模型.相信大家和我一样,在开始着手的时候,一定会有这么些问题: 1.如何选择3D模型的导出格式 2.如何对模型文件进行优化 3.在大流量的项目中兼容性怎么样 让我们 ...

  3. Zip文件压缩(加密||非加密||压缩指定目录||压缩目录下的单个文件||根据路径压缩||根据流压缩)

    1.写入Excel,并加密压缩.不保存文件 String dcxh = String.format("%03d", keyValue); String folderFileName ...

  4. Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

  5. 下载zip格式文件(压缩Excel文件为zip格式)

    Mongodb配置文件参考这一篇:http://www.cnblogs.com/byteworld/p/5913061.html package util; import java.io.Buffer ...

  6. 关于ZIP大文件压缩

    实测:4.76 GB一个单文件压缩没有什么问题. import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

  7. Java实现文件压缩与解压[zip格式,gzip格式]

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并 ...

  8. Webpack 2 视频教程 015 - Webpack 2 中的文件压缩

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  9. 用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载

    用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载,将一个完整的项目进行展示,主要有以下几个部分: 1.servlet部分   Export 2.工具类:TxtFileU ...

随机推荐

  1. Linux zookeeper 单机安装

    Zookeeper(端口2181) 下载地址 http://mirror.bit.edu.cn/apache/zookeeper/ 解压到/usr/local目录 >tar -zxvf zook ...

  2. 剑指OFFER例题——从尾到头打印链表

    /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val ...

  3. String特殊值的判断方式

    对String的特殊值的判断上,除了要关注是否为null,还要关注是否是空字符串. 经常处理的时候直接判断是否为Null就好了,这样很容易出现问题: if(null!=str) { //not goo ...

  4. k8s的内置DNS增加父系DNS方法

    我们都知道K8S有内置DNS,是在搭建K8S时候以容器方式起来的,那么有时候我们需要解析内部DNS地址该怎么办呢,我们可以搭建个内部DNS 但是怎么让K8S通过内部DNS解析呢? 可以尝试如下方法 在 ...

  5. 转: 如何用手机访问电脑本地 localhost 网页或者服务器, 以调试web项目

    最近开始转向移动开发方向,因此对于一个移动开发的前端来说,使用各种真机来进行自己网站或者系统的界面进行针对性的调试就显的尤为重要了. 因此,会经常通过电脑开启一个 wifi 来供手机进行连接,形成一个 ...

  6. su: cannot set user id: Resource temporarily unavailable问题解决

    操作环境 SuSE11sp1 问题现象 执行su - test命令切换失败,提示"su: cannot set user id: Resource temporarily unavailab ...

  7. Android 开发进入Linux系统执行命令 2018-5-25 Fri.

    /** * 进入linux cmd执行命令 * * @param command * @return */ private boolean runRootCommand(String command) ...

  8. C# 读取ini文件,读不出来原因

    先赋上相关读取ini文件代码 public class INIHelper { public string inipath; [DllImport("kernel32")] pri ...

  9. ERROR: dump failed because assets could not be loaded

    在命令行输入命令,想查看到app的包名,报错,如下: D:\测试\测试\android-sdk_r16-windows\android-sdk-windows\platform-tools>aa ...

  10. hdu1799-循环多少次?-(组合恒等式)

    循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...