Ale*_*rte 17 java metadata image
来自stackoverflow的人们,
我花了一些时间谷歌搜索我的问题的解决方案,但没有什么伟大的出来.
我想将元数据写入我从头开始创建的图像.
我对Java Advanced Image API的理解是我应该使用IIOMetadata,但我发现的代码片段似乎过于复杂.
然后我搜索了一个库并找到了Sanselan,但它看起来有点旧,而且编写元数据并不是很方便.
我实际上使用ImageIO.write创建图像(图像,"png",baos);
我理解图像metadatas由于其类似XML的结构而有点复杂.
有人能指点我的教程,解决方案,图书馆......?
谢谢Alexis.
Rog*_*cia 25
几天前我不得不做同样的事情.我还没有找到互联网上的确切解决方案,但看着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;
}
| 归档时间: | 
 | 
| 查看次数: | 17653 次 | 
| 最近记录: |