用Java编写图像元数据,最好是PNG

我想将元数据写入创建的PNG图像。

我对Java Advanced Image

API的理解是应该使用IIOMetadata,但是我发现的代码片段似乎过于复杂。然后,我搜索了一个库,发现了Sanselan,但它看起来有点旧,并且对于 编写

元数据不是很方便。

为了实际创建图像,我使用

ImageIO.write(image, "png", baos);

我了解图像元数据由于其类似XML的结构而难以处理。任何人都可以向我指出可以提供帮助的教程,解决方案或库吗?

回答:

几天前,我不得不做同样的事情。.我也没有在互联网上找到确切的解决方案,但看着这com.sun.imageio.plugins.png.PNGMetadata班课我可以取得一些结果。

要将自定义元数据写入PNG文件:

public byte[] writeCustomData(BufferedImage buffImg, String key, String value) throws Exception {

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);

metadata.mergeTree("javax_imageio_png_1.0", root);

//writing the data

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();

}

然后,读取数据:

public String readCustomData(byte[] imageData, String key) throws IOException{

ImageReader imageReader = ImageIO.getImageReadersByFormatName("png").next();

imageReader.setInput(ImageIO.createImageInputStream(new ByteArrayInputStream(imageData)), true);

// read metadata of first image

IIOMetadata metadata = imageReader.getImageMetadata(0);

//this cast helps getting the contents

PNGMetadata pngmeta = (PNGMetadata) metadata;

NodeList childNodes = pngmeta.getStandardTextNode().getChildNodes();

for (int i = 0; i < childNodes.getLength(); i++) {

Node node = childNodes.item(i);

String keyword = node.getAttributes().getNamedItem("keyword").getNodeValue();

String value = node.getAttributes().getNamedItem("value").getNodeValue();

if(key.equals(keyword)){

return value;

}

}

return null;

}

以上是 用Java编写图像元数据,最好是PNG 的全部内容, 来源链接: utcz.com/qa/403367.html

回到顶部