服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java 压缩图片(只缩小体积,不更改图片尺寸)的示例

java 压缩图片(只缩小体积,不更改图片尺寸)的示例

2021-11-02 15:39Marydon Java教程

这篇文章主要介绍了java 如何压缩图片体积,帮助大家更好的利用Java处理图片,应对特殊情况,感兴趣的朋友可以了解下

1.情景展示

  在调用腾讯身份证OCR接口的时候,由于要求图片大小只能限制在1MB以内,这样,就必须使用到图片压缩技术

2.代码展示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
 * 图片处理工具类
 * @explain
 * @author Marydon
 * @creationTime 2019年9月3日上午10:14:17
 * @version 1.0
 * @since
 * @email marydon20170307@163.com
 */
public class ImgUtils {
    /**
     * 压缩图片(通过降低图片质量)
     * @explain 压缩图片,通过压缩图片质量,保持原图大小
     * @param quality
     *       图片质量(0-1)
     * @return byte[]
     *      压缩后的图片(jpg)
     * @throws
     */
    public static byte[] compressPicByQuality(byte[] imgByte, float quality) {
        byte[] imgBytes = null;
        try {
            ByteArrayInputStream byteInput = new ByteArrayInputStream(imgByte);
            BufferedImage image = ImageIO.read(byteInput);
 
            // 如果图片空,返回空
            if (image == null) {
                return null;
            }
            // 得到指定Format图片的writer(迭代器)
            Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
            // 得到writer
            ImageWriter writer = (ImageWriter) iter.next();
            // 得到指定writer的输出参数设置(ImageWriteParam )
            ImageWriteParam iwp = writer.getDefaultWriteParam();
            // 设置可否压缩
            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
             // 设置压缩质量参数
            iwp.setCompressionQuality(quality);
 
            iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
 
            ColorModel colorModel = ColorModel.getRGBdefault();
            // 指定压缩时使用的色彩模式
            iwp.setDestinationType(
                    new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));
 
            // 开始打包图片,写入byte[]
            // 取得内存输出流
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            IIOImage iIamge = new IIOImage(image, null, null);
 
            // 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
            // 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput
            writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));
            writer.write(null, iIamge, iwp);
            imgBytes = byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            System.out.println("write errro");
            e.printStackTrace();
        }
        return imgBytes;
    }
}

3.其它代码

  import org.apache.commons.codec.binary.Base64;

?
1
2
3
4
5
6
7
8
9
10
11
12
String imgBase64 = "";
try {
    // 图片大小超过1MB
    if (file.getSize()/1024 > 1024) {
        byte[] imgBytes = ImgUtils.compressPicByQuality(file.getBytes(),0.1F);
        imgBase64 = Base64.encodeBase64String(imgBytes);
    } else {
        imgBase64 = Base64.encodeBase64String(file.getBytes());
    }
} catch (IOException e1) {
    e1.printStackTrace();
}

  说明:

  生成的base64图片没有图片格式头,即:data:image/jpeg;base64,

4.增加前端代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
 * 拍照或选择图片
 */
this.uploadPicture = function () {
    // js 获取文件对象
    var fileObj = document.getElementById("file").files[0];
    if (null == fileObj) {
        alert("图像上传失败,请重试!");
    }
    // TODO 显示遮罩
     
    // 创建form表单
    var formFile = new FormData();
    //加入文件对象
    formFile.append("file", fileObj);
    // 创建XMLHttpRequest 对象
    var xhr = new XMLHttpRequest();
    xhr.open("post", baseUrl + "/weixin/facein/upImg3.do", true);
    xhr.onload = function () {
        var resData = JSON.parse(this.responseText)
        // 将返回数据转换成JSON对象
        var json = eval('(' + resData.data2 + ')');
        // 身份证识别成功
        if (json.ret == 0) {
            // TODO 将所需数据填充到页面
             
        } else {
            alert("识别失败,请重试!" + json.msg);
        }
        document.getElementById("file").value = "";
        // TODO 隐藏遮罩
    };
    // 调用腾讯接口
    xhr.send(formFile);
};

以上就是java 压缩图片(只缩小体积,不更改图片尺寸)的示例的详细内容,更多关于java 压缩图片的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/Marydon20170307/p/11486776.html

延伸 · 阅读

精彩推荐
  • Java教程Java web spring异步方法实现步骤解析

    Java web spring异步方法实现步骤解析

    这篇文章主要介绍了Java web spring异步方法实现步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可...

    护花使者4042020-08-06
  • Java教程Java实现大文件的切割与合并操作示例

    Java实现大文件的切割与合并操作示例

    这篇文章主要介绍了Java实现大文件的切割与合并操作,结合实例形式分析了java基于io及util操作大文件按指定个数分割与合并相关操作技巧,需要的朋友可以参...

    HiBoyljw4302021-05-12
  • Java教程HashMap工作原理_动力节点Java学院整理

    HashMap工作原理_动力节点Java学院整理

    这篇文章主要介绍了HashMap工作原理_动力节点Java学院整理,需要的朋友可以参考下...

    动力节点1432020-09-18
  • Java教程Spring Cloud Zuul的重试配置详解

    Spring Cloud Zuul的重试配置详解

    这篇文章主要介绍了Spring Cloud Zuul的重试配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    ming5822021-04-20
  • Java教程Java线程休眠_动力节点Java学院整理

    Java线程休眠_动力节点Java学院整理

    sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。下面通过实例代码给大家介绍Java线程休眠的知识,需要的朋友...

    动力节点2192020-10-28
  • Java教程Java反射机制的简单讲解

    Java反射机制的简单讲解

    这篇文章主要介绍了Java反射机制的简单讲解,本文讲解了Java的高级概念反射机制,通过文字介绍案例该项概念和代码的详细展示,需要的朋友可以参考下...

    _Yoke8162021-09-23
  • Java教程在Java中使用基本的正则表达式

    在Java中使用基本的正则表达式

    这篇文章主要介绍了在Java中使用基本的正则表达式,本文通过简要的案例,说明了很多场景下的正则表达式的用法,列出了正则表达式匹配规则的表格,需要的...

    水墨之白5212021-09-23
  • Java教程Java自动化工具Ant的基础使用教程

    Java自动化工具Ant的基础使用教程

    这篇文章主要介绍了Java自动化工具Ant的基础使用教程,例子在Windows系统下操作演示,讲解了Ant基本的文件操作和属性,需要的朋友可以参考下 ...

    时之沙2332020-04-06