57

jpegファイルとしてjavax.imageio.ImageIO保存するために使用しています。BufferedImage具体的には、次の Java 関数を作成しました。

public static void getScreenShot(BufferedImage capture, Path folder, String filename) {
        try {
            ImageIO.write(capture, "jpeg", new File(folder.toString()+"/"+filename+".jpg"));
        } catch (AWTException | IOException ex) {
            Logger.getLogger(ScreenShotMaker.class.getName()).log(Level.SEVERE, null, ex);
        }
}

画像加工ソフトと同じように、jpegファイルの圧縮レベルを変更したい。しかし、私は に欠けていると思われるこのオプションを探していますImageIO

圧縮レベルとその方法を設定できますか?

4

5 に答える 5

65

より簡潔な方法は、ImageWriterから直接取得することImageIOです。

ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam();
jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
jpgWriteParam.setCompressionQuality(0.7f);

ImageOutputStream outputStream = createOutputStream(); // For example implementations see below
jpgWriter.setOutput(outputStream);
IIOImage outputImage = new IIOImage(image, null, null);
jpgWriter.write(null, outputImage, jpgWriteParam);
jpgWriter.dispose();

圧縮のレベル (品質) を明示的に設定するには、への呼び出しImageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT)が必要です。

ImageWriteParam.setCompressionQuality() 1.0f最高品質、最小圧縮、0.0fは最低品質、最大圧縮です。

ImageWriter.setOutputを渡す必要がありImageOutputStreamます。このメソッドは を受け入れますObjectが、ドキュメントによると、通常はサポートされていません。

Object以外の一般的な使用はImageOutputStream、出力デバイスまたはイメージング プロトコルと直接対話するライターを対象としています。正当なクラスのセットは、ライターのサービス プロバイダーのgetOutputTypesメソッドによって通知されます。ほとんどのライターはImageOutputStream.classImageOutputStream.

ほとんどのケースは、次の 2 つのクラスで処理する必要があります。

  • FileImageOutputStream- 出力をorImageOutputStreamに直接書き込むの実装。FileRandomAccessFile
  • MemoryCacheImageOutputStreamImageOutputStream-出力を通常の に書き込むの実装OutputStream。通常はByteArrayOutputStream(ヒントをありがとう、@lmiguelmh !) と共に使用されます。
于 2014-10-11T22:34:04.117 に答える