Java 从字节[]提取图像元数据

Java 从字节[]提取图像元数据,java,image,metadata,javax.imageio,jai,Java,Image,Metadata,Javax.imageio,Jai,我有一个字节数组中的图像数据(byte[]imgData)。我想获取其元数据,例如: 尺寸 彩色/黑白 文件类型(JPEG、PNG等) 我该怎么做?如果有我必须知道的图书馆,请告诉我 我发现了,但上面说它和JPEG图像有关。我想对所有图像都这样做。此外,它也没有解释它是如何工作的。不幸的是,支持所有设想(或即将想到)的图像格式是不现实的。简直太多了。使用标准J2SE,我们可以满足从获取的字符串[]中返回的类型。如图所示 将Java Advanced Imaging添加到运行时增加了对进一步

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

  • 尺寸
  • 彩色/黑白
  • 文件类型(JPEG、PNG等)
我该怎么做?如果有我必须知道的图书馆,请告诉我


我发现了,但上面说它和JPEG图像有关。我想对所有图像都这样做。此外,它也没有解释它是如何工作的。

不幸的是,支持所有设想(或即将想到)的图像格式是不现实的。简直太多了。使用标准J2SE,我们可以满足从获取的
字符串[]
中返回的类型。如图所示


将Java Advanced Imaging添加到运行时增加了对进一步图像格式(包括TIFF)的支持(通过服务提供商接口)。

您可以使用普通图像IO执行此操作:

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...
ImageInputStream=ImageIO.createImageInputStream(新的ByteArrayInputStream(imgData);//假设imgData是字节[],如您的问题所示
迭代器读卡器=ImageIO.getImageReaders(流);
如果(!readers.hasNext()){
//我们不知道这种格式,放弃吧
}
ImageReader=readers.next();
reader.setInput(流);
//现在查询您喜欢的属性
//尺寸:
int width=reader.getWidth(0);
int height=reader.getHeight(0);
//文件格式(通常可以使用数组中的第一个元素):
字符串[]格式=reader.getOriginatingProvider().getFormatNames();
//颜色模型(请注意,对于大多数JPEG,这将返回null,因为Java没有YCbCr颜色模型,但至少这会让您继续):
ImageTypeSpecifier类型=reader.getRawImageType(0);
ColorModel cm=type.getColorModel();
//……等等。。。
对于更高级的属性,您可能希望查看
iimetadata
,但我发现大多数时候我并不需要它(而且API太麻烦了)


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

谢谢您的回答。很抱歉,这是如何回答我的问题的?我只是想澄清一下,我并不是在寻找“所有设想过的图像格式”.多用一些就足够了。你找到你问题的答案了吗?@feisal我很抱歉这是一个老项目。我不确定我是如何做到的。我会尝试通过我的代码存档找到它,但不确定需要多长时间