import java.awt.Dimension;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException; import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.io.File;
import javax.imageio.ImageIO; /**
* JPG图片压缩工具
* @author clj
*
*/
public class ImageUtil {
/**
* 将原图src压缩后存入des中
* @param src 原图片文件
* @param des 压缩后的存储文件
* @param imgSize 图片缩放的最大尺寸
* @param quality 图片质量0~1
*/
public static void compress(File src,File des, int imgSize,float quality) {
FileOutputStream out = null;
try {
//读取源图片到内存中
Image image = ImageIO.read(src);
//获得压缩尺寸
Dimension dim = getRectangle(image.getWidth(null), image.getHeight(null),imgSize);
//在内存中创建压缩图片的缓冲区
BufferedImage tmpImg=new BufferedImage(dim.width,dim.height ,BufferedImage.TYPE_3BYTE_BGR);
//在缓冲区按缩放后的大小绘制压缩图片
tmpImg.getGraphics().drawImage(image.getScaledInstance(dim.width,dim.height,Image.SCALE_SMOOTH), 0, 0, null);
//设置图片质量,
JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tmpImg);
jep.setQuality(quality, true);
//保存压缩图片
//输出图片存在则先删除
if(des.exists()){
des.delete();
}
//获得输出流
out = new FileOutputStream(des);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tmpImg);
} catch (Exception ex) {
ex.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 获得压缩图片尺寸
* 最长边压缩为size px,短边按比例变化
* @param width
* @param height
* @return
*/
private static Dimension getRectangle( int width, int height, int size){
Dimension dim = new Dimension();
double w = width+0.0;
double h = height + 0.0;
double rate = w/h;
//宽或高大于size时,将较大者缩小为size,较小者则按比例变化
if(w > h && w > size){
w = size;
h = w / rate;
}else if(h > w && h > size){
h = size;
w = h*rate;
}
width = (int)w;
height = (int)h;
dim.width = width;
dim.height = height;
return dim;
} public static void main(String args[]){
ImageUtil.compress(new File("D:/test/img/src.jpg"), new File("D:/test/img/out.jpg"),600,1f);
}
}

最新文章

  1. linux下打开txt显示乱码的解决方法
  2. BizTalk开发系列(八) BizTalk Server 常识整理
  3. Core Data 使用
  4. [转]OBOUT ASP.NET HTML Editor - Insert HTML
  5. php入门引言
  6. easyui源码翻译1.32--Layout(布局)
  7. 平衡搜索树(三) B-Tree
  8. Wireshark 使用教程
  9. 分享一套 CodeSmit 代码生成模板。
  10. Professional C# 6 and .NET Core 1.0 - 37 ADO.NET
  11. 从覆盖bootstrap样式谈css选择器优先级
  12. java 接口默认修饰符问题
  13. Spring BeanFactory源码学习
  14. JavaScript 循环性能比较
  15. 通过Excel认识POI
  16. Java面向对象 其他对象
  17. TP5.0 PHPExcel 数据表格导出导入(原)
  18. Linxu基础知识:终端、终端模拟器、shell
  19. webp 图形文件操作工具包 win32 (编译 libwebp-20171228-664c21dd 版本)
  20. 2019 CCPC wannfly winter camp Day 5

热门文章

  1. 模板页 相对路径 JS 加载问题
  2. UITextView(文本视图) 学习之初体验
  3. JavaScript禁止用户多次提交方法
  4. 浅析Struts1和Struts2的Action线程安全问题
  5. js post传值
  6. Lost Cows(BIT poj2182)
  7. JS 输出对象的属性以及方法[转载]
  8. poj 1095 Trees Made to Order
  9. C语言经典程序190例
  10. synchronized常见用法解析及示例