уменьшить разрешение изображения в Java - PullRequest
12 голосов
/ 17 июня 2011

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

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

Ответы [ 4 ]

10 голосов
/ 17 июня 2011

Согласно этому сообщению в блоге: 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);
6 голосов
/ 18 июня 2011

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

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

Этот код отлично работает для меня. если вам нужно изменить размер изображения, то вы можете измените шкалу х и у здесь JAI.create("SubsampleAverage", image, xscale,yscale, qualityHints);

0 голосов
/ 18 июня 2011

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

0 голосов
/ 18 июня 2011

Вы можете использовать JAI для увеличения сжатия записанного JPEG без какого-либо масштабирования. Смотри http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Encode.doc.html

...