java - 如何将 grails 中的 png/gif/jpg 转换为 jpg 并保持图像的高质量?

标签 java grails image-processing jpeg image-resizing

我使用以下方法将图像转换为 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();
    }
}

最佳答案

您可以通过获取 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 是低压缩(但文件大小较大)的不错选择。

请注意,OpenJDK 不支持 JPEG 图像:ImageIO not able to write a JPEG file

关于java - 如何将 grails 中的 png/gif/jpg 转换为 jpg 并保持图像的高质量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13680324/

相关文章:

json - Grails 1.3.9解析JSON文件

c - 我如何在互联网上找到 pbmpak.c 文件?

java RGB颜色空间到YCrCb颜色空间转换

java - 从缓冲读取器保存到 JTextArea

java - 如何将 JRE 从 1.8.0.241 更改为最新的 13

grails - 休眠:强制get()遵守其参数的数据类型

c - 图像处理中的流畅操作

java - JavaFX MediaPlayer不会显示我所有音频文件的专辑封面,即使它们有一个

java - 递归读取任何 java 对象并将复杂类型提取到 HashMap 中

oracle - Grails错误-TNS:监听器当前不知道连接描述符中给出的SID