2012-12-03 38 views
1

我使用以下方法將圖像轉換爲jpg。我的解決方案的問題是,它會降低質量。如何將grails中的png/gif/jpg轉換爲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(); 
    } 
} 
+1

退房http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/ –

+0

與JPEG獲得的壓縮可能會有所不同很大程度上取決於圖像內容。一旦你減少了顏色以產生GIF或8位PNG,你從JPEG中獲得的壓縮效果就不會那麼好。 –

回答

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 not able to write a JPEG file

+0

你能用我的代碼和你的修改提供完整的代碼示例嗎? – confile

+0

我已將代碼更新爲完整的示例。另外請注意,使用OpenJDK時,JPG圖像可能會有問題;確保你使用的是Sun/Oracle JVM。 – ataylor

+0

你對我的錯誤有什麼想法嗎? – confile

相關問題