我有一个字节数组(byte[] imgData
)中的图像数据。我想获取它的元数据,例如:
- 方面
- 彩色 / 黑白
- 文件类型(JPEG、PNG、...)
- ...
我怎样才能做到这一点?如果有我必须知道的图书馆,请告诉我。
我发现Getting metadata from JPEG in byte array form但它说它与 JPEG 图像有关。我想对所有图像执行此操作。此外,它没有解释它是如何工作的。
我有一个字节数组(byte[] imgData
)中的图像数据。我想获取它的元数据,例如:
我怎样才能做到这一点?如果有我必须知道的图书馆,请告诉我。
我发现Getting metadata from JPEG in byte array form但它说它与 JPEG 图像有关。我想对所有图像执行此操作。此外,它没有解释它是如何工作的。
不幸的是,支持曾经设想(或即将考虑)的每一种图像格式是不切实际的。简直太多了。使用标准 J2SE,我们可以满足String[]
从ImageIO.getReaderFileSuffixes()
. 正如在这个答案中看到的那样。
将 Java Advanced Imaging 添加到运行时会增加对其他图像格式(包括 TIFF)的支持(通过服务提供者接口)。
您可以使用普通 ImageIO 执行此操作:
ImageInputStream stream = ImageIO.createImageInputStream(new ByteArrayInputStream(imgData); // assuming imgData is byte[] as in your question
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
if (!readers.hasNext()) {
// We don't know about this format, give up
}
ImageReader reader = readers.next();
reader.setInput(stream);
// Now query for the properties you like
// Dimensions:
int width = reader.getWidth(0);
int height = reader.getHeight(0);
// File format (you can typically use the first element in the array):
String[] formats = reader.getOriginatingProvider().getFormatNames();
// Color model (note that this will return null for most JPEGs, as Java has no YCbCr color model, but at least this should get you going):
ImageTypeSpecifier type = reader.getRawImageType(0);
ColorModel cm = type.getColorModel();
// ...etc...
对于更高级的属性,您可能想要查看IIOMetadata
,但我发现大多数时候我不需要它(而且 API 太麻烦了)。
ImageIO.getReaderFileSuffixes()
正如 Andrew 所提到的,您仍然受限于 列出的格式。您可能需要为特定格式添加插件。