在Java中降低图像分辨率

14

我需要使用Java程序减小图像大小(不是宽度和高度)。

是否有好的API可用于此?

我需要将大小从1MB降至约50kb-100 kb。当然,分辨率会降低,但这并不重要。


2
比起那个关于增加分辨率的问题,这个好多了。 - Bala R
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);

7
这是可用的代码。
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);


1
年轻人,你的回答很好。但是我能否增加这张图片的dpi级别,或者有其他方法可以实现吗? - Buntylm

0

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

我尝试了那个例子,但它并没有起作用。当我传入1.0f以外的任何浮点值时,它会创建更大的图像尺寸。而当我传入1.0f时,它会创建一个文件尺寸较小但质量太低,甚至可以说图像丢失了。 - Adil Shaikh
你可以查看可用的质量描述和值;其含义因格式而异。顺便问一下,你使用的是什么格式? - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接