6

ImageIO.write を使用すると品質が大幅に低下することに気付きました。自動圧縮を無効にするにはどうすればよいですか?

val baos: ByteArrayOutputStream = new ByteArrayOutputStream
val newBi = new BufferedImage(img.getWidth, img.getHeight, BufferedImage.TYPE_INT_RGB)
val gr = newBi.createGraphics()
gr.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), Color.WHITE, null)
ImageIO.write(newBi, "jpeg", baos)
val b = baos.toByteArray
baos.close()
4

3 に答える 3

12

ImageWriterを使用します。

ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // Needed see javadoc
param.setCompressionQuality(1.0F); // Highest quality
writer.write(image);

写真以外の画像には .png を使用します。


@PiotrekDe がコメントしたように、以下はより論理的に思えます。

writer.write(null, new IIOImage(image, null, null), param)
于 2013-06-10T01:02:24.467 に答える
2

JPEG 圧縮は非可逆です。ただし、PNG 圧縮はロスレスです。したがって、png形式で書くことをお勧めします。つまり、PNG 形式で圧縮しても品質が低下しません。単純な行:

ImageIO.write(newBI,"png",someOutputStream);

ただし、高品質の jpg 形式が必要な場合は、品質を 100% に設定します。次のコードが役立つ場合があります。

    ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next();
    ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam();
    jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    jpgWriteParam.setCompressionQuality(1f);
    jpgWriter.setOutput(someOutputStream);
     //better to use ImageOutputStream
    jpgWriter.write(null,new IIOImage(yourImage, null, null), jpgWriteParam);
于 2016-02-21T02:23:18.637 に答える
0

jpeg 画像は非可逆圧縮を使用しています。代わりに png を使用してください。それも圧縮されていますが、可逆アルゴリズムを使用しています。

于 2013-06-10T00:41:09.590 に答える