如何在没有完全解码的情况下从 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
}
}
上面的代码发生了什么:
- PNG 字节来自磁盘
- 使用 png 解码器解码的字节数
- java图像构建
- 计算颜色
我可以跳过步骤3
吗?例如在解码期间计算字节数或更好地部分解码 png 图像并仅存储颜色信息。如何使用 java?
备注
据我所知,存储尺寸相同但颜色数量不同的图像会导致尺寸不同。例如照片可以比相同图像大 1000,但只有一种颜色(例如黑色)。因此,理论上 可以在不解码完整图像的情况下计算仅读取字节的图像。我对吗?或者编码算法不支持部分解码?
如果你想避免创建完整的图像,你可以使用 PNGJ,一个 Java 解码器库(免责声明,我自己的)允许逐行逐行读取图像排。
主要优点是更少的内存消耗(仅当图像很大时才相关),也许还有速度。 BufferedImage
与更高级别的 iamge 抽象的另一个区别是,该库以 PNG 使用的格式为您提供原始像素值,没有映射或转换 - 根据您的场景,这可能是一个加号或不。
当然,你仍然在对图像进行完全解码,但没有办法逃避这一点。
考虑以下 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
与更高级别的 iamge 抽象的另一个区别是,该库以 PNG 使用的格式为您提供原始像素值,没有映射或转换 - 根据您的场景,这可能是一个加号或不。
当然,你仍然在对图像进行完全解码,但没有办法逃避这一点。