2011-01-06 3 views
1

Ich habe ein Bild a.jpg mit Größe 4.7kb, wenn seine Upload auf Web-Server, dessen Größe 15.5KB werden ...Wie in Java

Ich verwende folgenden Code Bild Miniaturgröße verringern.

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 (..) ... ist wie folgt:

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; 
} 

Jede Idee, andere Größe und Qualitätsoptimierung, während Bilder java speichern. Ich benutze Struts2 MVC ... vielen Dank. Diese

Antwort

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

scheint wie eine hohe Qualität für eine JPEG-Miniaturansicht. Versuchen Sie um 60 oder 50.

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

Huh?

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

OK ..

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

Aber was? Warum ein JPEGEncodeParam einstellen und als PNG speichern? Hat das überhaupt Auswirkungen? Versuchen Sie ..

+0

ja, einige Code ist nur überflüssig ... Ich habe gerade von einem Artikel und versuchen Sie es. Wenn Sie eine bessere Alternative kennen ... Ich kann diesen ganzen Code ersetzen. du hast recht .. es hat keine Wirkung ... ob wir png, jpg, etc. schreiben bei 50 ... quality value .. die Bildqualität wird schlecht. obwohl die Größe um etwa 35% verringert ist. Vielen Dank –