Java 如何将grails中的png/gif/jpg转换为jpg以保持图像的高质量?
我使用以下方法将图像转换为jpg。我的解决方案的问题是,它会把质量降低很多 在减小文件大小的同时,保持图像质量的好方法是什么Java 如何将grails中的png/gif/jpg转换为jpg以保持图像的高质量?,java,grails,image-processing,jpeg,image-resizing,Java,Grails,Image Processing,Jpeg,Image Resizing,我使用以下方法将图像转换为jpg。我的解决方案的问题是,它会把质量降低很多 在减小文件大小的同时,保持图像质量的好方法是什么 def convertToJpg(currentImage) { try { InputStream inStreamCrop = new ByteArrayInputStream(currentImage) BufferedImage bufferedImage = ImageIO.read(inStreamCrop)
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();
}
}
您可以通过获取对象并通过参数对其进行设置来控制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图像:检查使用JPEG获得的压缩将根据图像内容有很大差异。一旦你减少颜色以生成GIF或8位PNG,你从JPEG获得的压缩就不会那么好了。你能用我的代码和你的修改提供完整的代码示例吗?我已经将我的代码更新为一个完全有效的示例。另外,请注意,JPG图像在OpenJDK中可能存在问题;请确保您使用的是Sun/Oracle JVM。输出流必须是
ImageOutputStream
的实现。您能更具体一点吗?我必须如何编写它?用内存cacheimageoutputstream
将您的用tearrayoutputstream
包装起来。