Ram*_*hna 2 java bufferedimage metadata inputstream javax.imageio
我正在使用以下代码在 PNG 图像中写入元数据:
public synchronized static byte[] writeMetaDataInPNGImage(BufferedImage buffImg,
String key, String value)
{
byte[][] image = null;
try
{
ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier
.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
// adding metadata
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
IIOMetadataNode textEntry = new IIOMetadataNode("tEXtEntry");
textEntry.setAttribute("keyword", key);
textEntry.setAttribute("value", value);
IIOMetadataNode text = new IIOMetadataNode("tEXt");
text.appendChild(textEntry);
IIOMetadataNode root = new IIOMetadataNode("javax_imageio_png_1.0");
root.appendChild(text);
int width = buffImg.getWidth();
int height = buffImg.getHeight();
metadata.mergeTree("javax_imageio_png_1.0", root);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream stream = ImageIO.createImageOutputStream(baos);
writer.setOutput(stream);
writer.write(metadata, new IIOImage(buffImg, null, metadata), writeParam);
stream.close();
return baos.toByteArray();
// return ImageIO.read(new ByteArrayInputStream(baos.toByteArray()));
}
catch (Exception e)
{
System.out.println("Exception while writing \t " + e.getMessage() + " :: "
+ e.getStackTrace());
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
写入元数据后,我返回带有元数据和图像数据的字节数组。
byte[] pngjdata = writeMetaDataInPNGImage(img.getAsBufferedImage(),"key", "hello");
Run Code Online (Sandbox Code Playgroud)
如果我保存图像, pngjdata[]我可以看到图像中的元数据,但是如果我BufferedImage从这个字节数组创建并保存它,我看不到写入的元数据。
InputStream in1 = new ByteArrayInputStream(pngjdata);
BufferedImage brImage = ImageIO.read(in1);
Run Code Online (Sandbox Code Playgroud)
为什么brImage没有我写的元数据?
为什么
brImage没有我写的元数据?
ABufferedImage不包含您要查找的元数据。该BufferedImage实例只是表示像素值,颜色模型,示例模型等,或在数据需要换言之显示图像。也没有用于设置/获取元数据的 API(但您可能对getProperty(name)继承自遗留 AWT ImageAPI 的相关方法感到困惑)。
ImageIOAPI中的元数据表示为实例,IIOMetadata您可以通过该getAsTree(..)方法获取它的各种类似 DOM 的形式(例如"javax_imageio_png_1.0"PNG 或“标准”"javax_imageio_1.0"格式)。
要在您的应用程序中将像素数据和元数据组织在一起,您可以使用IIOImage该类。
您可以使用该ImageReader.readAll(index, param)方法同时读取像素数据和元数据。您可以同时编写两者,使用ImageWriter.write(null, iioImage, param),就像上面已经做的一样(请注意,该write方法的第一个参数是流元数据,它与图像元数据不同,对于 PNG 只是 pass null)。
| 归档时间: |
|
| 查看次数: |
1629 次 |
| 最近记录: |