2011-01-06 57 views
1

降低圖像的縮略圖大小與大小4.7kb的圖像A.JPG,當其上傳至網絡服務器,它的大小成爲15.5KB ...我如何在Java

我使用下面的代碼。

BufferedImage bi = ImageIO.read(business.getImage()); //business is sturts2 Form & image instance of File class 
      int height = bi.getHeight(); 
      int width = bi.getWidth(); 

      if (height > Constants.BIZ_IMAGE_HEIGHT || width > Constants.BIZ_IMAGE_WIDTH) { 
       height = Constants.BIZ_IMAGE_HEIGHT; 
       width = Constants.BIZ_IMAGE_WIDTH; 
      } 

      InputStream is = UtilMethod.scaleImage(new FileInputStream(business.getImage()), width, height); 
      File f = new File(businessImagesPath, business.getImageFileName()); 
      UtilMethod.saveImage(f, is); 
      is.close(); 

UtilMethod.scaleImage(..)......情況如下:

public static InputStream scaleImage(InputStream p_image, int p_width, int p_height) throws Exception { 

    InputStream imageStream = new BufferedInputStream(p_image); 
    Image image = (Image) ImageIO.read(imageStream); 

    int thumbWidth = p_width; 
    int thumbHeight = p_height; 

    // Make sure the aspect ratio is maintained, so the image is not skewed 
    double thumbRatio = (double) thumbWidth/(double) thumbHeight; 
    int imageWidth = image.getWidth(null); 
    int imageHeight = image.getHeight(null); 
    double imageRatio = (double) imageWidth/(double) imageHeight; 
    if (thumbRatio < imageRatio) { 
     thumbHeight = (int) (thumbWidth/imageRatio); 
    } else { 
     thumbWidth = (int) (thumbHeight * imageRatio); 
    } 

    // Draw the scaled image 
    BufferedImage thumbImage = new BufferedImage(thumbWidth, 
      thumbHeight, BufferedImage.TYPE_INT_RGB); 

    Graphics2D graphics2D = (Graphics2D) thumbImage.createGraphics(); 
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
           RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, Color.WHITE, null); 


    // Write the scaled image to the outputstream 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 
    JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(thumbImage); 

    int quality = 85; // Use between 1 and 100, with 100 being highest quality 
    quality = Math.max(0, Math.min(quality, 100)); 

    param.setQuality((float) quality/100.0f, false); 
    encoder.setJPEGEncodeParam(param);   
    encoder.encode(thumbImage); 
    ImageIO.write(thumbImage, "png", out); 

    ByteArrayInputStream bis = new ByteArrayInputStream(out.toByteArray()); 
    return bis; 
} 

任何其它尺寸和質量優化理念,同時使用Java保存圖像。我正在使用struts2 MVC ...非常感謝你。

回答

2
int quality = 85; // Use between 1 and 100, with 100 being highest quality 

這看起來像是JPEG縮略圖的高質量。嘗試60或50左右。

quality = Math.max(0, Math.min(quality, 100)); 

咦?

param.setQuality((float) quality/100.0f, false); 
encoder.setJPEGEncodeParam(param);   

OK ..

encoder.encode(thumbImage); 
ImageIO.write(thumbImage, "png", out); 

不過吧?爲什麼設置JPEGEncodeParam並將其存儲爲PNG?這甚至有什麼作用?試試..

ImageIO.write(thumbImage, "jpg", out); 
+0

是的,有些代碼只是多餘的...我剛剛從一些文章,並試試看。如果你知道更好的選擇......我可以替換這整個代碼。 對不起...它沒有任何作用...是否我們寫png,jpg,..等 在50 ...質量值..圖像質量變壞。雖然規模減少了約35%。謝謝 – 2011-01-06 11:38:57