简介

我们在项目中经常会遇到图片上传的需求,如商品图片,但图片太大的话,在客户端加载太慢影响用户体验,所有一般会将图片进行压缩。

实现

原图

添加依赖

net.coobird

thumbnailator

0.4.8

按质量压缩

import java.io.File;

import java.io.FileOutputStream;

import net.coobird.thumbnailator.Thumbnails;

public class Client {

public static void main(String[] args) throws Exception {

Thumbnails.of(new File("D:/showqrcode.jpg"))

.scale(1f) //图片大小(长宽)压缩比例 从0-1,1表示原图

.outputQuality(0.5f) //图片质量压缩比例 从0-1,越接近1质量越好

.toOutputStream(new FileOutputStream("D:/showqrcode_50.jpg"));

}

}

压缩后图片

图片大小从665KB压缩到了77KB。

按比例缩放

import java.io.File;

import java.io.FileOutputStream;

import net.coobird.thumbnailator.Thumbnails;

public class Client2 {

public static void main(String[] args) throws Exception {

Thumbnails.of(new File("D:/showqrcode.jpg"))

.scale(0.5f) //图片大小(长宽)压缩 从0按照

.outputQuality(0.5f) //图片质量压缩比例 从0-1,越接近1质量越好

.toOutputStream(new FileOutputStream("D:/showqrcode_50%.jpg"));

}

}

按大小和比例缩放

import java.io.File;

import java.io.FileOutputStream;

import net.coobird.thumbnailator.Thumbnails;

public class Client21 {

public static void main(String[] args) throws Exception {

Thumbnails.of(new File("D:/showqrcode.jpg"))

.size(500, 300) // 图片比例不变

.toOutputStream(new FileOutputStream("D:/showqrcode_500_300.jpg"));

}

}

按大小缩放

import java.io.File;

import java.io.FileOutputStream;

import net.coobird.thumbnailator.Thumbnails;

public class Client22 {

public static void main(String[] args) throws Exception {

Thumbnails.of(new File("D:/showqrcode.jpg"))

.forceSize(500, 300) //不保持图片比例

.toOutputStream(new FileOutputStream("D:/showqrcode_500_300.jpg"));

}

}

旋转

import java.io.File;

import java.io.FileOutputStream;

import net.coobird.thumbnailator.Thumbnails;

public class Client3 {

public static void main(String[] args) throws Exception {

Thumbnails.of(new File("D:/showqrcode.jpg"))

.forceSize(500, 300)

.rotate(90f) //向右旋转

.toOutputStream(new FileOutputStream("D:/showqrcode+90.jpg"));

}

}

加水印

水印图片

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import net.coobird.thumbnailator.Thumbnails;

import net.coobird.thumbnailator.geometry.Positions;

public class Client4 {

public static void main(String[] args) throws IOException {

Thumbnails.of("D:/showqrcode.jpg")

.size(1280, 1024)

.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:/watermark.jpg")),

0.5f) //位置,水印来源,透明度

.outputQuality(0.8f)

.toFile("D:/showqrcode_watermark_bottom_right.jpg");

}

}

裁剪

import java.io.IOException;

import net.coobird.thumbnailator.Thumbnails;

import net.coobird.thumbnailator.geometry.Positions;

public class Client5 {

public static void main(String[] args) throws IOException {

Thumbnails.of("D:/showqrcode.jpg")

.sourceRegion(Positions.CENTER, 800, 600) //位置,宽,高

.size(800, 600)

.keepAspectRatio(false)

.toFile("D:/showqrcode_region_center.jpg");

}

}

拼接

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.Objects;

import javax.imageio.ImageIO;

public class Client6 {

public static void main(String[] args) throws Exception {

byte[] bytes = joinImages(false, new File("D:/showqrcode.jpg"), new File("D:/showqrcode.jpg"));

if (Objects.nonNull(bytes)) {

new ByteArrayInputStream(bytes).transferTo(new FileOutputStream("D:/showqrcode_join.jpg"));

}

}

/**

* 将多张图片拼接成一张

*

* @param horizontal 是否为水平拼接

* @param files 文件列表

* @return 拼接后的文件字节数组

*/

private static byte[] joinImages(boolean horizontal, File... files) throws IOException {

if (Objects.isNull(files) || files.length == 0) {

return null;

}

List imageList = new ArrayList<>();

for (File file : files) {

BufferedImage image = ImageIO.read(file);

imageList.add(image);

}

int height = imageList.get(0).getHeight();

int width = imageList.get(0).getWidth();

if (horizontal) {

width = imageList.stream().mapToInt(BufferedImage::getWidth).sum();

} else {

height = imageList.stream().mapToInt(BufferedImage::getHeight).sum();

}

//创建拼接后的图片画布,参数分别为宽,高,类型,这里我们使用RGB3元色类型

BufferedImage resultImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics graphics = resultImage.getGraphics();

int previousWidth = 0;

int previousHeight = 0;

for (BufferedImage image : imageList) {

//向画布上画图片

graphics.drawImage(image, previousWidth, previousHeight, null);

if (horizontal) {

previousWidth += image.getWidth();

} else {

previousHeight += image.getHeight();

}

}

ByteArrayOutputStream output = new ByteArrayOutputStream();

ImageIO.write(resultImage, "jpg", output);

return output.toByteArray();

}

}

更多用法请参考官方文档

总结

图片经过以上处理之后都会去除EXIF信息,关于EXIF详情,请查看java获取图片的GPS信息

参考

java 图片压缩100k_java实现图片压缩相关推荐

  1. java 图片压缩100k_Java 实现图片压缩的两种方法

    问题背景. 典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示. 如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了. 用户上传的原图可能由于清晰度较高而体 ...

  2. 使用Thumbnails压缩或放大图片大小(java)

    首先看下缩放图片的核心代码,其实只有一行而已 //ins表示ByteArrayInputStream形式的图片 //scale中的数据就是缩小或者放大的比例,比如小于1则表示压缩,大于1表示放大 // ...

  3. java jpeg压缩解码_图片压缩(iOS)

    场景很简单,上传图片前压缩图片,节省流量和发图时间.最近看了看 iOS 的静态图片压缩,这里记个笔记.本人之前没学过 iOS 和 Swift,本文是一篇入门文章,描述不到位之处请大家多多批评斧正. ̄ω ...

  4. Java图片压缩大小,图片缩放

    添加依赖 <!-- 图片缩略图 --><dependency><groupId>net.coobird</groupId><artifactId& ...

  5. Java图片压缩及解决遇到压缩时出现黑底的问题

    在项目中有个需求是将图片和其他文件合并,最后输出为一个文件,我在大佬们的帮助下找到合适的压缩工具类来实现压缩,并做如下总结: 方案一 package com.example.cn.service;im ...

  6. Java之~ 上传 图片压缩,阿里图片压缩,图片旋转方法工具类

    需要的jar jai_codec-1.1.3.jar,jai_core-1.1.3.jar,simpleimage-1.2.0.jar,metadata-extractor-2.3.1.jar(旋转时 ...

  7. java压缩图片比例quality_Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】...

    本文实例讲述了java实现的上传并压缩图片功能.分享给大家供大家参考,具体如下: 先看效果: 原图:1.33M 处理后:27.4kb 关键代码: package codeGenerate.util; ...

  8. java jsoup抓取百度图片保存到本地,并压缩到指定大小(可指定宽高或者流大小)

    代码如下: package cn.xyz.commons.utils; import java.awt.image.BufferedImage; import java.io.ByteArrayInp ...

  9. Java post路径请求和图片下载、压缩分享给你们!!干货

    @java图片下载功能实现 try {// 创建一个文件夹File file = new File(fileStr);file.mkdirs();//多个图片下载地址for (int i = 0; i ...

最新文章

  1. [leetcode] Binary Tree Preorder Traversal
  2. 政府网站公祭日,如何使网站整体变灰
  3. 制作基于http的yum源2
  4. 付力力: 基于 ImpalaS 构建实时用户行为分析引擎
  5. 网管日志-06.09.26
  6. mysql关于死锁的优化_mysql死锁探究及优化
  7. 计算机专业方面的论文,计算机专业毕业论文
  8. Java对文件/文件夹进行压缩或解压缩
  9. axure树形表格_树状菜单 表格 水平菜单 垂直菜单
  10. 江城武汉,一座离开后会怀念的城市
  11. 拾色器 插件 Farbtastic
  12. 究极小白的第一篇csdn博客
  13. RmNet和CDC-ECM的区别,NDIS和RNDIS的区别。
  14. C语言_SDUST_OJ(3)
  15. 视觉SLAM十四讲学习第二部分(ch7-ch14)
  16. 任务栏出现两个重复图标的解决办法
  17. Linux的判断两个字符串是否相等
  18. Netty学习(七):心跳检测机制
  19. 计算机图形学基础之一点两点三点透视图
  20. 《一个广告人的自白》中的经典内容

热门文章

  1. 前端学习(1754):前端调试值之监控页面重绘的技巧
  2. 前端学习(1432):模板引擎概述
  3. 前端学习(7):web的三大技术
  4. mybatis学习(17):列名与属性名不一致的情况(使用别名)
  5. 2.项目管理重要性探讨
  6. java学习(139):多个catch块
  7. java学习(59):static修饰内部类
  8. Github|类别不平衡学习资源(上)
  9. Android 一直往文件写数据_( 十 ) 小众但好用:通过 Google drive 备份与同步 Keepass 数据库...
  10. Thinkphp 配置不用输入index.php