Уменьшить разрешение изображения в java

Мне нужно уменьшить размер изображения (не ширины и высоты) с помощью программы Java. Есть ли у них какой-либо хороший API для этого?

Мне нужно уменьшить размер от 1 МБ до 50 кб - 100 кб. Конечно, разрешение будет уменьшаться, но это не имеет значения.

Ответ 1

Это рабочий код

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

Ответ 2

В соответствии с этим сообщением в блоге: http://i-proving.com/2006/07/06/java-advanced-imaging/ вы можете использовать Java Advanced Imaging Library, чтобы делать то, что вы хотите. Следующий примерный код должен предоставить вам хорошую отправную точку. Это изменит размер изображения как по высоте, так и по ширине, а также по качеству изображения. Когда изображение будет иметь нужный размер, вы можете масштабировать его до требуемой высоты и ширины пикселей при отображении изображения.

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

Ответ 4

Если ваш тип изображения поддерживается реализацией ImageWriteParam, вы можете отрегулировать качество, как показано на рисунке example. Другие методы ImageWriteParam, например getBitRate(), могут позволить вам оптимизировать результат.