问题 降低java中的图像分辨率


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

我需要将大小从1MB减小到大约50kb - 100 kb。 当然,决议会减少,但这无关紧要。


1958
2018-06-17 19:43


起源

比提高分辨率的问题要好得多...... - Bala R
问题解决了 !!检查我的答案。 - Mohammad Adil


答案:


根据这篇博文: 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);

9
2018-06-17 19:55





这是工作代码

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


6
2018-06-17 22:37



伟大的答案年轻人。但我可以增加这个图像的dpi级别有没有办法做到这一点? - Buntylm
@BuntyMadan看到这个: stackoverflow.com/a/14050844/235710 - Mohammad Adil


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


0
2018-06-17 20:07





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


0
2018-06-17 20:41



我尝试了这个例子,它不起作用。当我传递除1.0f之外的任何浮点值时,它会创建更大的图像大小。当我通过1.0f它创建一个低大小的文件,但质量太低或我可以说图像只是丢失。 - Mohammad Adil
您可以查看可用的质量描述和值;含义因格式而异。 BTW,你用的是什么格式? - trashgod