1

画像をjpgに変換するには、次の方法を使用します。私のソリューションの問題は、品質が大幅に低下することです。

ファイルサイズを縮小しながら、画像の品質を維持するための良い方法は何ですか?

def convertToJpg(currentImage) {
    try {
         InputStream inStreamCrop = new ByteArrayInputStream(currentImage)
         BufferedImage bufferedImage = ImageIO.read(inStreamCrop)

         // create a blank, RGB, same width and height, and a white background
         BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(),
               bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
         newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0, Color.WHITE, null);

         ByteArrayOutputStream baos=new ByteArrayOutputStream()
         // write to jpeg file
         ImageIO.write(newBufferedImage, "jpg", baos);
         baos.flush()
         def image = baos.toByteArray()
         baos.close()
         return image

    } catch (IOException e) {
        e.printStackTrace();
    }
}
4

1 に答える 1

2

ImageWriterオブジェクトを取得し、パラメータを使用して設定することで、JPEGの品質を制御できます。例えば:

import javax.imageio.stream.*
import javax.imageio.*

BufferedImage bufferedImage = ImageIO.read(new File("test.png"));
float quality = 0.9;
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
writer.setOutput(new FileImageOutputStream(new File("test.jpg")));
writer.write(null, new IIOImage(bufferedImage, null, null), param);

品質パラメータの範囲は0〜1で、1が最小の圧縮になります。別の値を試してください。低圧縮(ただしファイルサイズが大きい)には0.9が適していることがわかりました。

JPEG画像はOpenJDKではサポートされていないことに注意してください:ImageIOはJPEGファイルを書き込めません

于 2012-12-03T16:15:35.227 に答える