Java中图片压缩处理

时间:2023-03-08 17:32:56
Java中图片压缩处理

原文http://cuisuqiang.iteye.com/blog/2045855

整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享。
首先,要压缩的图片格式不能说动态图片,你可以使用bmp、png、gif等,至于压缩质量,可以通过BufferedImage来指定。
在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的。

Java代码  Java中图片压缩处理

  1. package test;
  2. import java.io.*;
  3. import java.util.Date;
  4. import java.awt.*;
  5. import java.awt.image.*;
  6. import javax.imageio.ImageIO;
  7. import com.sun.image.codec.jpeg.*;
  8. /**
  9. * 图片压缩处理
  10. * @author 崔素强
  11. */
  12. public class ImgCompress {
  13. private Image img;
  14. private int width;
  15. private int height;
  16. @SuppressWarnings("deprecation")
  17. public static void main(String[] args) throws Exception {
  18. System.out.println("开始:" + new Date().toLocaleString());
  19. ImgCompress imgCom = new ImgCompress("C:\\temp\\pic123.jpg");
  20. , 400);
  21. System.out.println("结束:" + new Date().toLocaleString());
  22. }
  23. /**
  24. * 构造函数
  25. */
  26. public ImgCompress(String fileName) throws IOException {
  27. File file = new File(fileName);// 读入文件
  28. img = ImageIO.read(file);      // 构造Image对象
  29. width = img.getWidth(null);    // 得到源图宽
  30. height = img.getHeight(null);  // 得到源图长
  31. }
  32. /**
  33. * 按照宽度还是高度进行压缩
  34. * @param w int 最大宽度
  35. * @param h int 最大高度
  36. */
  37. public void resizeFix(int w, int h) throws IOException {
  38. if (width / height > w / h) {
  39. resizeByWidth(w);
  40. } else {
  41. resizeByHeight(h);
  42. }
  43. }
  44. /**
  45. * 以宽度为基准,等比例放缩图片
  46. * @param w int 新宽度
  47. */
  48. public void resizeByWidth(int w) throws IOException {
  49. int h = (int) (height * w / width);
  50. resize(w, h);
  51. }
  52. /**
  53. * 以高度为基准,等比例缩放图片
  54. * @param h int 新高度
  55. */
  56. public void resizeByHeight(int h) throws IOException {
  57. int w = (int) (width * h / height);
  58. resize(w, h);
  59. }
  60. /**
  61. * 强制压缩/放大图片到固定的大小
  62. * @param w int 新宽度
  63. * @param h int 新高度
  64. */
  65. public void resize(int w, int h) throws IOException {
  66. // SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
  67. BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB );
  68. , 0, w, h, null); // 绘制缩小后的图
  69. File destFile = new File("C:\\temp\\456.jpg");
  70. FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流
  71. // 可以正常实现bmp、png、gif转jpg
  72. JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  73. encoder.encode(image); // JPEG编码
  74. out.close();
  75. }
  76. }

运行后在C盘temp下生成一个465.jpg,像素大小为600*400,像素大小是我指定的。用时也就是一两秒的事情,注意,我这张图片是10M的,压缩后是40.5KB
一些细节事项可以参考代码中的注释。

要注意的是,你可能想试一试较大图片的处理能力,如果你的JDK没有指定默认内存,那可能会有如下异常,因为内存不够大:

  1. -4-14 16:25:11
  2. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  3. )
  4. )
  5. )
  6. )
  7. )
  8. )
  9. )
  10. )
  11. )
  12. )
  13. )

解决方法:
在Eclipse里选:Window->Preference->Installed JREs->Edit(选中jre),
在Default VM Arguments里输入-Xms256m -Xmx1024m,表示最小堆内存256M,最大堆1G,然后运行就可以了