Java 降低PNG比特深度的最佳方法是什么

Java 降低PNG比特深度的最佳方法是什么,java,image,png,Java,Image,Png,我在BuffereImage中有一个PNG图像,我想降低位深度以使其更小。下面是一个将图像的一小部分保存到“磁盘”的函数。writeImage函数是将图像写入磁盘的函数。有什么想法吗 private BufferedImage createSubImage(Avatar avatar, int[] srcRect, Dimension size, BufferedImage image, String name) throws IOException { Graphics2D graph

我在BuffereImage中有一个PNG图像,我想降低位深度以使其更小。下面是一个将图像的一小部分保存到“磁盘”的函数。writeImage函数是将图像写入磁盘的函数。有什么想法吗

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;
}

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