1. 程式人生 > >Java高清晰高品質 圖片壓縮

Java高清晰高品質 圖片壓縮

網上搜索了很多,壓縮出來的效果實在不能令人滿意,研究了一些程式碼,自己寫了一個,壓縮出來的效果很好。但是有一個缺點,可能也是java的缺點吧,呵呵。

在jdk1.6以下的版本環境下,壓縮部分圖片會很慢,經過我測試,如果圖片的DPI越高,速度越慢,一般WEB使用圖片DPI都是72,速度很快。大家可以試下。我測試了幾張DPI為300,印刷品質的圖片,大概要35秒左右,當然還和機器記憶體有關。

在jdk1.6環境下,速度能令人滿意,從之前的35秒減少到了1秒多一點點。提升了這麼多,jdk1.6改進實在是大。

經過我除錯發現,慢的部分主要是在g2.drawImage(image, 0, 0,imageWidth, imageHeight, Color.white,null);,這一句。

主要的壓縮程式碼是public static void ImageScale(String path,String fileName,String toFileName)

 這個方法。

以下是我的程式碼,大家可以參考改進。

  1. package sundy.img;
  2. /**
  3.  * ImageCompress 提供使用者將大圖片按比例壓縮為小圖片,支援JPG
  4.  * Please refer to: <BR>
  5.  * <P>
  6.  * @author feng_sunddy <[email protected]>
  7.  * @version 1.0
  8.  * @see java.awt.image.BufferedImage
  9. **/
  10. import java.awt.BorderLayout;
  11. import
     java.awt.Button;
  12. import java.awt.TextField;
  13. import java.awt.Color;
  14. import java.awt.Dimension;
  15. import java.awt.FileDialog;
  16. import java.awt.Font;
  17. import java.awt.Frame;
  18. import java.awt.Graphics;
  19. import java.awt.Graphics2D;
  20. import java.awt.Image;
  21. import java.awt.Insets;
  22. import java.awt.Label;
  23. import java.awt.MediaTracker;
  24. import java.awt.Panel;
  25. import java.awt.Toolkit;
  26. import java.awt.event.ActionEvent;
  27. import java.awt.event.ActionListener;
  28. import java.awt.event.WindowAdapter;
  29. import java.awt.event.WindowEvent;
  30. import java.awt.image.BufferedImage;
  31. import java.awt.image.ConvolveOp;
  32. import java.awt.image.Kernel;
  33. import java.io.File;
  34. import java.io.FileNotFoundException;
  35. import java.io.FileOutputStream;
  36. import java.io.IOException;
  37. import com.sun.image.codec.jpeg.JPEGCodec;
  38. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  39. publicclass ImageCompress extends Frame {
  40. privatestaticfinallong serialVersionUID = 48L;
  41. publicstaticvoid main(String[] args){
  42.         String fileName = "F:/share/bigimages/b-4.jpg";
  43.         String gui = "";
  44. if (args.length > 0) fileName = args[0];
  45. if (args.length > 1) gui = "gui";
  46. if (gui.equals("gui")){
  47. new ImageCompress(fileName);
  48.     }else{
  49. long c = System.currentTimeMillis();
  50.             ImageCompress.ImageScale(getFilePath(fileName), getFileFullName(fileName), getFileName(fileName) + "-s." + getFileExt(fileName).toLowerCase());
  51.             System.out.println("elapse time:" + (System.currentTimeMillis() - c)/1000.0f + "s");
  52.       }
  53.     }
  54. privatestaticfinal String version = "ImageCompress v1.0";
  55. public ImageCompress(String fileName) {
  56. super(version);
  57.     file = fileName;
  58.     createUI();
  59.     loadImage(fileName);
  60.     setVisible(true);
  61.   }
  62. /**
  63.    * A Hashtable member variable holds the image processing
  64.    * operations, keyed by their names.
  65.   **/
  66. private Panel mControlPanel;
  67. private BufferedImage mBufferedImage;
  68. private Label labelWidth = new Label("width:");    
  69. private TextField textWidth = new TextField(7);
  70. private Label labelHeight = new Label("height:");    
  71. private TextField textHeight = new TextField(7);
  72. private String file;
  73. /**
  74.    * createUI() creates the user controls and lays out the window.
  75.    * It also creates the event handlers (as inner classes) for
  76.    * the user controls.
  77.   **/
  78. privatevoid createUI() {
  79.     setFont(new Font("Serif", Font.PLAIN, 12));
  80. // Use a BorderLayout. The image will occupy most of the window,
  81. //   with the user controls at the bottom.
  82.     setLayout(new BorderLayout());
  83. // Use a Label to display status messages to the user.
  84. final Label statusLabel = new Label("Welcome to " + version + ".");
  85.     textWidth.setText("160");
  86.     textHeight.setText("160");
  87. // Create a Button for loading a new image.
  88.     Button loadButton = new Button("Load...");
  89. // Add a listener for the button. It pops up a file dialog
  90. //   and loads the selected image file.
  91.     loadButton.addActionListener(new ActionListener() {
  92. publicvoid actionPerformed(ActionEvent ae) {
  93.         FileDialog fd = new FileDialog(ImageCompress.this);
  94.         fd.setVisible(true);
  95. if (fd.getFile() == nullreturn;
  96.         String path = fd.getDirectory() + fd.getFile();
  97.         file = path;
  98.         loadImage(path);
  99.       }
  100.     });
  101.     Button buttonResize = new Button("Resize");
  102.     buttonResize.addActionListener(new ActionListener(){
  103. publicvoid actionPerformed(ActionEvent ae){
  104.             resizeImage(file);
  105.         }
  106.     });
  107. // Add the user controls at the bottom of the window.
  108.     mControlPanel = new Panel();
  109.     mControlPanel.add(loadButton);
  110.     mControlPanel.add(labelWi