2009-08-24 82 views
1

我很难使用Java JAI(Java Advance Imaging)API将JPEG图像的分辨率从1024x800改为512x400。JAI更改JPEG解析度

我玩过API并不断获取流或java.lang.OutOfMemory例外。

任何人都有一个工作示例。

回答

2

这里的工作示例,没有保修:)

BufferedImage scaleImage(BufferedImage sourceImage, int scaledWidth) { 
    float scale = scaledWidth/(float) sourceImage.getWidth(); 
    int scaledHeight = (int) (sourceImage.getHeight() * scale); 
    Image scaledImage = sourceImage.getScaledInstance(
     scaledWidth, 
     scaledHeight, 
     Image.SCALE_AREA_AVERAGING 
    ); 

    BufferedImage bufferedImage = new BufferedImage(
     scaledImage.getWidth(null), 
     scaledImage.getHeight(null), 
     BufferedImage.TYPE_INT_RGB 
    ); 
    Graphics g = bufferedImage.createGraphics(); 
    g.drawImage(scaledImage, 0, 0, null); 
    g.dispose(); 

    return bufferedImage; 
} 
+0

这是AWT一个基于“现况”提供依据,不是吗? – Jesse 2009-08-24 19:46:09

+0

啊,呃,你说得对。我会删除答案,但它已被接受。我会反过来赞扬你的。 – skaffman 2009-08-24 19:49:23

4

下面是使用JAI

public void resize(String filename, RenderedOp image, double wScale, double hScale) 
{ 
    // now resize the image 
    ParameterBlock pb = new ParameterBlock(); 
    pb.addSource(image); // The source image 
    pb.add(wScale); // The xScale 
    pb.add(hScale); // The yScale 
    pb.add(0.0F); // The x translation 
    pb.add(0.0F); // The y translation 

    RenderingHints hints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);  
    RenderedOp resizedImage = JAI.create("SubsampleAverage", pb, hints); 

    // lastly, write the newly-resized image to an 
    // output stream, in a specific encoding 
    try 
    { 
     FileOutputStream fos = new FileOutputStream(new File(filename)); 
     JAI.create("encode", resizedImage, fos, getImageType(filename), null); 
    } 
    catch (FileNotFoundException e) 
    { 
    } 
}