4

画像を圧縮したいjpeg、つまり、サイズを変更せずに解像度を下げたい。私がそれを行うのに役立つ良いJavaライブラリはありますか? SOには似たような投稿がたくさんありますが、それらのほとんどは画像のサイズも変更されます。

そうでない場合、どうすればプログラムでそれを行うことができますか? たとえば、引数が 0.9 の場合、画像の解像度は 0.1 分の 1 に低下します...

4

2 に答える 2

6

通常、「解像度」はサイズを意味します。代わりにJPEG品質を意味しますか?それが、サイズを変更せずに圧縮するために私が考えることができる唯一の方法です。

その場合は、Java2D ImageIO API を使用できます。次のようなものが機能します(このページから適応):

BufferedImage bufferedImage = ImageIO.read(...);

ImageWriter writer = (ImageWriter)ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(...);

File file = new File(...);
FileImageOutputStream output = new FileImageOutputStream(file);
writer.setOutput(output);
IIOImage image = new IIOImage(bufferedImage, null, null);
writer.write(null, image, iwp);
writer.dispose();

残念ながら、画像の既存の JPEG 品質を取得する方法はないと思うので、圧縮品質に固定値を使用する必要があります。

于 2013-02-14T19:32:52.167 に答える
1

Java2Dこれは、 API を使用して出力画像の圧縮品質を設定することで実行できます。これにより、画像の品質とファイル サイズが縮小されますが、元の画像と同じ幅と高さが維持されます。

    File imageFile = new File("original.jpg");
    File compressedImageFile = new File("compressed.jpg");

    InputStream is = new FileInputStream(imageFile);
    OutputStream os = new FileOutputStream(compressedImageFile);

    float quality = 0.7f; // Change this as needed

    BufferedImage image = ImageIO.read(is);

    // get all image writers for JPG format
    Iterator<ImageWriter> writers = ImageIO
            .getImageWritersByFormatName("jpg");

    if (!writers.hasNext())
        throw new IllegalStateException("No writers found");

    ImageWriter writer = (ImageWriter) writers.next();
    ImageOutputStream ios = ImageIO.createImageOutputStream(os);
    writer.setOutput(ios);

    // set compression quality
    ImageWriteParam param = writer.getDefaultWriteParam();

    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(quality);

    writer.write(null, new IIOImage(image, null, null), param);

    // clean resources e.g. close streams

より高度なものが必要な場合はimageJ、[ と [を確認してください。Fiji][2]これらは、使いやすい API を備えた Java の非常に強力な画像処理ライブラリです。

于 2013-02-14T19:26:58.490 に答える