考虑以下 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
}
}
上面的代码中发生了什么:
- Png 字节来自磁盘
- 使用 png 解码器解码的字节
- 构建java镜像
- 计算颜色
我可以跳过步骤3
吗?例如在解码期间计算字节数或更好地部分解码 png 图像并仅存储颜色信息。如何用java做到这一点?
注意
正如我所发现的,存储具有相同尺寸但不同颜色计数的图像会导致不同的尺寸。例如,照片可以比相同图像大 1000,但只有一种颜色(例如黑色)。所以理论上可以计算仅读取字节的图像而不解码整个图像。我对吗?或者编码算法不支持部分解码?
最佳答案
如果您想避免创建完整图像,可以使用 PNGJ ,一个 Java 解码器库(免责声明,我自己的),允许逐行渐进地读取图像。
主要优点是内存消耗更少(仅当图像很大时才相关),也许还有速度。与 BufferedImage 等更高级别图像抽象相比,另一个区别是该库以 PNG 使用的格式提供原始像素值,无需映射或转换 - 根据您的场景,这可以是否是一个加号。
当然,您仍然在完全解码图像,但无法避免这一点。
关于java - 如何在不完全解码的情况下计算 png 文件的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29136816/