如何在没有完全解码的情况下从 png 文件中计算颜色?

How count colors from png files without full decoding?

考虑以下 java 代码:

File file = ...

BufferedImage image = ImageIO.read(file);
int w = image.getWidth();
int h = image.getHeight();
int count = 0;
for (int y = 0; y < h; y++) {
    for (int x = 0; x < w; x++) {
        int pixel = image.getRGB(x, y);
        //count colors here
    }
}

上面的代码发生了什么:

  1. PNG 字节来自磁盘
  2. 使用 png 解码器解码的字节数
  3. java图像构建
  4. 计算颜色

我可以跳过步骤3吗?例如在解码期间计算字节数或更好地部分解码 png 图像并仅存储颜色信息。如何使用 java?

备注

据我所知,存储尺寸相同但颜色数量不同的图像会导致尺寸不同。例如照片可以比相同图像大 1000,但只有一种颜色(例如黑色)。因此,理论上 可以在不解码完整图像的情况下计算仅读取字节的图像。我对吗?或者编码算法不支持部分解码?

如果你想避免创建完整的图像,你可以使用 PNGJ,一个 Java 解码器库(免责声明,我自己的)允许逐行逐行读取图像排。

主要优点是更少的内存消耗(仅当图像很大时才相关),也许还有速度。 BufferedImage 与更高级别的 iamge 抽象的另一个区别是,该库以 PNG 使用的格式为您提供原始像素值,没有映射或转换 - 根据您的场景,这可能是一个加号或不。

当然,你仍然在对图像进行完全解码,但没有办法逃避这一点。