paulwong

          重定義圖片尺寸

          http://www.thebuzzmedia.com/downloads/software/imgscalr/javadoc/org/imgscalr/Scalr.html
          http://stackoverflow.com/questions/11618205/resize-image-to-fixed-size-add-border-if-needed
          http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/
          http://stackoverflow.com/questions/5837781/resize-image-to-fixed-size

          http://blog.codejava.net/nam/reduce-image-quality-without-resizing/


          package com.paul.image;

          import java.awt.image.BufferedImage;
          import java.io.ByteArrayInputStream;
          import java.io.ByteArrayOutputStream;
          import java.io.File;
          import java.io.IOException;
          import java.util.Iterator;

          import javax.imageio.IIOImage;
          import javax.imageio.ImageIO;
          import javax.imageio.ImageWriteParam;
          import javax.imageio.ImageWriter;
          import javax.imageio.stream.FileImageOutputStream;

          public class ImageFileSizeReducer {
              
              private static String srcPic = "E:/PAUL/WORK/WORDSPACES/WORKSPACE1/Test1/data/pic1.jpg";
              
              private static String destPic = "E:/PAUL/WORK/WORDSPACES/WORKSPACE1/Test1/data/pic3.jpg";

              public static void reduceImageQuality(int sizeThreshold, byte[] srcImg,
                      String destPic) throws Exception {

                  float quality = 1.0f;

                  Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");

                  ImageWriter writer = (ImageWriter) iter.next();

                  ImageWriteParam iwp = writer.getDefaultWriteParam();

                  iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

                  ByteArrayInputStream inputStream = new ByteArrayInputStream(srcImg);

                  long fileSize = srcImg.length;

                  BufferedImage originalImage = ImageIO.read(inputStream);
                  IIOImage image = new IIOImage(originalImage, nullnull);

                  float percent = 0.8f; // 10% of 1

                  while (fileSize > sizeThreshold) {
                      if (percent >= quality) {
                          percent = percent * 0.1f;
                      }

                      quality -= percent;
                      iwp.setCompressionQuality(quality);

          //            ByteArrayOutputStream out = new ByteArrayOutputStream();
          //            ImageOutputStream imageos = ImageIO.createImageOutputStream(out);
                      
                      File file = new File(destPic);  
                      FileImageOutputStream output = new FileImageOutputStream(file);  
                      
                      writer.setOutput(output);
                      writer.write(null, image, iwp);
                      output.close(); // or imageos.flush();

          //            destImg = output.length();

                      long newFileSize = output.length();
                      if (newFileSize == fileSize) {
          //                createNewPic(quality);
                          
          // cannot reduce more, return
                          break;
                      } else {
                          fileSize = newFileSize;
                      }
                      System.out.println("quality = " + quality + ", new file size = "
                              + fileSize);

                  }
                  writer.dispose();


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

                      BufferedImage originalImage = ImageIO.read(new File(srcPic));

                      ByteArrayOutputStream baos = new ByteArrayOutputStream();
                      ImageIO.write(originalImage, "jpg", baos);
                      baos.flush();
                      byte[] imageInByte = baos.toByteArray();
                      baos.close();

                      ImageFileSizeReducer.reduceImageQuality(20000,imageInByte,destPic);
                  } catch (IOException e) {
                      System.out.println(e.getMessage());
                  }
              }

          }

          posted on 2013-03-26 16:46 paulwong 閱讀(365) 評論(0)  編輯  收藏 所屬分類: J2SE

          主站蜘蛛池模板: 洞头县| 太湖县| 阿尔山市| 深水埗区| 河间市| 甘洛县| 崇文区| 思南县| 长子县| 法库县| 龙里县| 赞皇县| 泰宁县| 西安市| 白沙| 安泽县| 洛宁县| 潼南县| 汝城县| 新和县| 陕西省| 麻阳| 潞西市| 丽水市| 友谊县| 阳高县| 格尔木市| 哈密市| 六安市| 斗六市| 高要市| 洛阳市| 离岛区| 潮安县| 本溪市| 高邮市| 大悟县| 通辽市| 七台河市| 方城县| 纳雍县|