12

我需要使用 Java 程序减小图像的大小(而不是宽度和高度)。他们有什么好的 API 可用吗?

我需要将大小从 1MB 减小到大约 50kb - 100 kb。当然,分辨率会降低,但这没关系。

4

4 回答 4

10

根据这篇博文:http: //i-proving.com/2006/07/06/java-advanced-imaging/你可以使用Java 高级成像库来做你想做的事。以下示例代码应该为您提供一个很好的起点。这将调整图像的大小,包括高度和宽度以及图像质量。一旦您的图像具有所需的文件大小,您可以在显示图像时将其缩放回所需的像素高度和宽度。

// read in the original image from an input stream
SeekableStream s = SeekableStream.wrapInputStream(
  inputStream, true);
RenderedOp image = JAI.create("stream", s);
((OpImage)image.getRendering()).setTileCache(null);

// now resize the image

float scale = newWidth / image.getWidth();

RenderedOp resizedImage = JAI.create("SubsampleAverage", 
    image, scale, scale, qualityHints);


// lastly, write the newly-resized image to an
// output stream, in a specific encoding

JAI.create("encode", resizedImage, outputStream, "PNG", null);
于 2011-06-17T19:55:00.007 回答
6

这是工作代码

public class ImageCompressor {
    public void compress() throws IOException {
        File infile = new File("Y:\\img\\star.jpg");
        File outfile = new File("Y:\\img\\star_compressed.jpg");

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                infile));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(outfile));

        SeekableStream s = SeekableStream.wrapInputStream(bis, true);

        RenderedOp image = JAI.create("stream", s);
        ((OpImage) image.getRendering()).setTileCache(null);

        RenderingHints qualityHints = new RenderingHints(
                RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);

        RenderedOp resizedImage = JAI.create("SubsampleAverage", image, 0.9,
                0.9, qualityHints);

        JAI.create("encode", resizedImage, bos, "JPEG", null);

    }

    public static void main(String[] args) throws IOException {

        new ImageCompressor().compress();
    }
}

这段代码对我来说很好用。如果您需要调整图像大小,则可以在此处更改 x 和 y 比例JAI.create("SubsampleAverage", image, xscale,yscale, qualityHints);

于 2011-06-17T22:37:52.460 回答
0

您可以使用 JAI 来增加书面 JPEG 的压缩率,而无需进行任何缩放。请参阅http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Encode.doc.html

于 2011-06-17T20:07:20.053 回答
0

如果您的图像类型由 的实现支持ImageWriteParam,您可以调整质量,如本示例所示。其他ImageWriteParam方法,例如getBitRate(),可能允许您优化结果。

于 2011-06-17T20:41:39.333 回答