2011-04-21 42 views
3

的位深度的最佳方法我在BufferedImage中有一个PNG图像,我想降低比特深度,以使其更小。以下是将图像的一小部分保存到“磁盘”的功能。 writeImage函数是将它写入磁盘的函数。有任何想法吗?请告诉我以降低PNG

private BufferedImage createSubImage(Avatar avatar, int[] srcRect, Dimension size, BufferedImage image, String name) throws IOException { 
    Graphics2D graphics; 
    BufferedImage thumb = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB); 
    graphics = (Graphics2D) thumb.getGraphics(); 

    //lower PNG bitdepth here 
    graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
    graphics.drawImage(image, 0, 0, size.width, size.height, srcRect[0], srcRect[1], 
      srcRect[2], srcRect[3], null); 

    writeImage(DataAccess.APP_DATA_BUCKET, thumb, "avatars/" + avatar.getId() + "/" + name); 
    thumb.flush(); 
    return thumb; 
} 

回答

1

PNG支持灰度,索引或真彩每通道8或16位。如果您通过将所有通道中的每个值四舍五入为4的倍数来减小比特深度,则生成的png会更小,因为压缩效果会更好。它将只使用6位而不是8位,所以它应该是原始大小的6/8左右,但可以更好(取决于图像),因为大多数嘈杂的,难以压缩的信息都在2个被删除的位中。