几天前,我不得不做同样的事情。.我也没有在互联网上找到确切的解决方案,但看着这
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;}


