2011年12月26日

Java BufferedImage Low Quality 解決方法


Java中常常使用java.awt.Image庫所提供的方法進行圖像的縮放、及裁切。我們可以使用Graphics2D g = image.createGraphics()的方式得到Graphics物件,並且可以對其繪製圖案上去,但是縮放圖片時,若直接使用draw方法繪製會產生極大的問題,如題Qualtiy降低的問題,在這裡我也提供了解決的方案與原始程式碼的比照。

低畫質的縮圖程式碼
if (imgtype == BufferedImage.TYPE_BYTE_INDEXED || imgtype == BufferedImage.TYPE_BYTE_BINARY) {
     IndexColorModel icm = (IndexColorModel) source.getColorModel();
     image = new BufferedImage(width, height, imgtype, icm);

} else {
     image = new BufferedImage(width, height, imgtype);
}
Graphics g = image.getGraphics();
g.drawImage(source, 0, 0, width, height, null);

Smooth解法程式碼
ColorModel dstCM = source.getColorModel();
image = new BufferedImage(dstCM, dstCM.createCompatibleWritableRaster(width, height),
         dstCM.isAlphaPremultiplied(), null);

Image scaleImage = source.getScaledInstance(width, height, Image.SCALE_SMOOTH);
Graphics2D g = image.createGraphics();
g.drawImage(scaleImage, 0, 0, width, height, null);

縮圖品質比較 :



總表比較 :
總類
畫質
檔案大小
低畫質縮圖
7.84kb
Smooth解法
7.84kb


由此可以下個結論,直接使用draw繪圖不僅得到低畫質的圖片,也無法得到較低的檔案大小,所以以後使用縮圖就要使用Smooth解法來解。

沒有留言:

ShareThis