[Java]图片压缩
Java中内置的压缩图片有两种方式:
- 通过Image的getScaledInstance方法将图片尺寸进行压缩,它的压缩策略有:
SCALE_DEFAULT 默认图像缩放算法 SCALE_FAST 缩放速度优先 SCALE_SMOOTH 图像平滑度优先 它的长处是能够在尽量不影响图像质量的情况下对图片进行一定的压缩,缺点是压缩的效果有局限性.
- 使用ImageWriteParam的setCompressionQuality方法设置ImageWrite输出图片时生成的图片质量,它的长处是能够在不改变图片尺寸的情况下将图片的大小压缩,而且压缩效率比較高.
下面代码是将两者一起使用,达到同一时候控制压缩图片尺寸和大小的功能.
package test;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Iterator;import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;public class CompressPicUtil {public Image CmopressPic(Image image)throws Exception {int newWidth;int newHeight;// 指定生成图宽高if (image.getWidth(null) > 1024) { //这里能够自己指定缩放的条件double rate = (double)image.getWidth(null)/1024;newWidth = 1024;newHeight = (int)(image.getHeight(null)/rate);} else {newWidth = image.getWidth(null);newHeight = image.getHeight(null);}// BufferedImage通过缩放进行压缩 压缩策略为Image.SCALE_FAST 速度优先BufferedImage buffer = new BufferedImage(newWidth, newHeight,BufferedImage.TYPE_INT_BGR);buffer.getGraphics().drawImage(image.getScaledInstance(newWidth, newHeight,Image.SCALE_FAST), 0, 0, null);// 获得一个ImageWriter输出流ImageWriter writer = null;ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(buffer);Iterator iter = ImageIO.getImageWriters(type, "jpg");if (iter.hasNext()) {writer = (ImageWriter) iter.next();}if (writer == null) {return null;}IIOImage iioImage = new IIOImage(buffer, null, null);// 指定压缩方式 压缩程度 色彩模式ImageWriteParam param = writer.getDefaultWriteParam();param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);param.setCompressionQuality(0.4F); //这里能够指定压缩的程度 0-1.0ColorModel colorModel = ColorModel.getRGBdefault();param.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel .createCompatibleSampleModel(16, 16))); // 将缓存中的图片依照指定的配置输出到字节数组中ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageOutputStream outputStream = ImageIO.createImageOutputStream(byteArrayOutputStream);writer.setOutput(outputStream);writer.write(null, iioImage, param);// 从字节数组中读取图片ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());Image smallImage = ImageIO.read(byteArrayInputStream);return smallImage;}}
它的压缩效果为(压缩时间已经刨去读取文件时间):
文件1 ---- 压缩前大小 3378KB 压缩后大小 44KB 压缩时间 639 ms 图片宽度 1024 图片高度 640
文件2 ---- 压缩前大小 2240KB 压缩后大小 60KB 压缩时间 295 ms 图片宽度 1024 图片高度 640
文件3 ---- 压缩前大小 1161KB 压缩后大小 37KB 压缩时间 224 ms 图片宽度 1024 图片高度 640
文件4 ---- 压缩前大小 1309KB 压缩后大小 50KB 压缩时间 194 ms 图片宽度 1024 图片高度 576
文件5 ---- 压缩前大小 872KB 压缩后大小 26KB 压缩时间 223 ms 图片宽度 1024 图片高度 576
转载于:https://www.cnblogs.com/jzdwajue/p/7126833.html
[Java]图片压缩相关推荐
- Java 图片压缩(Thumbnails)
https://www.cnblogs.com/zhaosq/p/13896446.html Java 图片压缩(Thumbnails)
- java 图片压缩不改变分辨率
转载:java 图片压缩不改变分辨率java压缩图片大小不改变图片分辨率_僵尸吃过跳跳糖的博客-CSDN博客_java 压缩图片分辨率 package com.cjn.util;import org. ...
- java 图片压缩100k_Java 实现图片压缩的两种方法
问题背景. 典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示. 如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了. 用户上传的原图可能由于清晰度较高而体 ...
- java 图片压缩 图片添加水印 thumbnailator javafx
应用截图 启动界面 添加图片 处理结果 项目地址 图片压缩: java 图片压缩 图片添加水印 thumbnailator javafx pom.xml <?xml version=" ...
- 解决java 图片压缩图片图片变色问题
最近有人遇到在处理在用Java进行图片压缩的时候,压缩后图片的背景色发生了变色,如图所示: 压缩前: 压缩后: 经查阅相关资料后发现可以用阿里巴巴的SImpleImage可以解决这个问题. 主要依赖以 ...
- Java图片压缩大小,图片缩放
添加依赖 <!-- 图片缩略图 --><dependency><groupId>net.coobird</groupId><artifactId& ...
- Java图片压缩并上传
public void uploadFile(@RequestParam(value = "file", required = false)MultipartFile[] file ...
- java图片压缩(谷歌工具类)
引入jar依赖 <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailato ...
- java 图片压缩100k_如何将图片压缩到100K以内,教你几种免费方法
一般我们在提交电子证件照时都要求100K以内的图片,超过则无法正常上传,那么有没有免费将图片压缩变小的方法呢?教你3个简单又免费的方法,收藏起来备用吧. 方法1:最简单粗暴的方式就是直接打开图片后用聊 ...
- java图片压缩不失真_软件分享 | Lit图片压缩
软件分享 01 软件名称 Lit图片压缩 02 软件版本 V1.2.0.016 03 软件简介 Lit图片压缩app是一款免费简单好用的图片压缩工具,让图片在不失真的情况下,进行压缩和裁剪,轻松就能压 ...
最新文章
- argparse.ArgumentParser()用法解析
- SQL Server 聚集索引 clustered index 非聚集索引Nonclustered Indexes键查找查找Key Lookup执行计划过程详解
- matplotlib figure转为numpy array或者PIL图像进行显示
- Hadoop配置学习
- 销户c语言,c – 如何在注销时优雅地退出QApplication?
- 基于KNN实现图像分类——理解图像分类
- Hanlp得到语义相似度的方法
- 二级公共基础知识_计算机二级选择题(公共基础知识)
- 程序员教程第五版笔记
- 项目1-员工(绩效)信息管理系统
- 时序预测 | MATLAB实现DBN深度置信网络时间序列预测
- 回弹强度记录表填写_混凝土抗压强度回弹法测试原始记录表.doc-_装配图网
- Android开发——GPS定位
- java可达性_Java 垃圾回收 - 可达性分析算法
- cpu型号怎么看服务器,看不懂CPU?学会看CPU只要五分钟
- mail163邮箱官网如何注册?
- 【斯坦福大学公开课CS224W——图机器学习】二、图机器学习中的传统方法(2)
- 18位身份证的正则表达式并说明
- 湘西纪行 芷江 芋头侗寨 通道 黔阳 高椅村
- 2015(2016届)校园招聘季——内推 篇