java - 如何在不完全解码的情况下计算 png 文件的颜色?

标签 java image png decode encode

考虑以下 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 等更高级别图像抽象相比,另一个区别是该库以 PNG 使用的格式提供原始像素值,无需映射或转换 - 根据您的场景,这可以是否是一个加号。

当然,您仍然在完全解码图像,但无法避免这一点。

关于java - 如何在不完全解码的情况下计算 png 文件的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29136816/

相关文章:

c# - .NET中的PNG图像处理

java - 在 Spring Boot 中排除 BootstrapConfiguration 类进行测试

Web 服务中的 Java FileInputStream

javascript - 在不模糊的情况下调整 Canvas 图像的大小

c++ - Qt:如何调整图像大小并保持其比例?

c# - 不清晰的转换图像。 wmf转png

java - GSON 库的 toJson() 返回错误的 json

java - 一种实现加载大量资源的共享类的优雅方法(在 Java 中)

javascript - 使用文件内容创建图像

c++ - 将 PNG 类型资源转换为 cv::Mat 时的 CreateDIBSection ERROR_TAG_NOT_FOUND