【问题标题】:Extract image metadata from byte[]从 byte[] 中提取图像元数据
【发布时间】:2013-05-14 22:37:19
【问题描述】:

我有一个字节数组 (byte[] imgData) 中的图像数据。我想获取它的元数据,例如:

  • 尺寸
  • 彩色/黑白
  • 文件类型(JPEG、PNG、...)
  • ...

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

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

【问题讨论】:

  • 您找到问题的答案了吗?
  • @feisal 很抱歉这是一个旧项目。不知道我(如果)我是怎么做到的。我会尝试浏览我的代码存档并找到它,但不确定需要多长时间

标签: java image metadata javax.imageio jai


【解决方案1】:

您可以使用普通 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() 列出的格式。您可能需要为特定格式添加插件。

【讨论】:

    【解决方案2】:

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

    将 Java Advanced Imaging 添加到运行时会增加对其他图像格式(包括 TIFF)的支持(通过服务提供者接口)。

    【讨论】:

    • 感谢您的回答。很抱歉,但这如何回答我的问题?澄清一下,我不是在寻找“曾经设想过的每种图像格式”。使用更多的就足够了。
    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多