从byte []中提取图像元数据

时间:2013-05-20 11:19:03

标签: java image metadata javax.imageio jai

我有一个字节数组(byte[] imgData)的图像数据。我想得到如下的元数据:

  • 尺寸
  • Color / Black&白
  • 文件类型(JPEG,PNG,...)
  • ...

我该怎么做?如果有一个我必须知道的图书馆,请告诉我。

我找到了Getting metadata from JPEG in byte array form,但它说它与JPEG图像有关。我想为所有图像做这个。此外,它没有解释它是如何工作的。

2 个答案:

答案 0 :(得分:0)

不幸的是,支持所设想的(或即将被想到的)每种图像格式都是不切实际的。有太多了。使用标准J2SE,我们可以满足从ImageIO.getReaderFileSuffixes()获得的String[]中返回的类型。如this answer中所示。

在运行时添加Java Advanced Imaging可为其他图像格式添加支持(通过服务提供程序接口),包括TIFF。

答案 1 :(得分:0)

您可以使用普通的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太麻烦了)。

正如Andrew所提到的,您仍然受限于ImageIO.getReaderFileSuffixes()列出的格式。您可能需要为特定格式添加插件。