java - 什么是降低 PNG 位深度的最佳方法

标签 java image png

我在 BufferedImage 中有一个 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 支持每 channel 8 或 16 位的灰度、索引或真彩色。例如,如果您通过将所有 channel 中的每个值四舍五入为 4 的倍数来自行减少位深度,则生成的 png 将更小,因为压缩会更好。它将只使用 6 位而不是 8 位,因此它应该是原始大小的 6/8 左右,但可以更好(取决于图像),因为大部分嘈杂、难以压缩的信息都在 2 个删除的位中。

关于java - 什么是降低 PNG 位深度的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738571/

相关文章:

java - Google Places API - 保存 place_id 并违反条款和条件

java - 当我尝试使用 Spring 和 file.properties 时,我看到错误

android - 如何从 SD 卡保存和获取图像 Cropped Android 的路径?

c++ - 使用 png++ 编写 png 图像

Java SMTP 邮件失败

java - 如何检查方法中的所有参数是否都是特定类型?

javascript - 您可以使用 JS 将所​​有帧从 -svg 导出到光栅图像 -jpg、png、..

image - 如果我的网页有大量从 flickr 加载的图像,这会影响我的带宽消耗吗?

ios - SpriteKit 背景 PNG,Alpha 显示黑色

r - 如何删除在 R 中使用 png() 创建的图像周围的边距