Java 创建BuffereImage后缺少元数据

Java 创建BuffereImage后缺少元数据,java,metadata,inputstream,bufferedimage,javax.imageio,Java,Metadata,Inputstream,Bufferedimage,Javax.imageio,我正在使用以下代码在PNG图像中写入元数据: public synchronized static byte[] writeMetaDataInPNGImage(BufferedImage buffImg, String key, String value) { byte[][] image = null; try {

我正在使用以下代码在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;
}
在写入元数据之后,我返回带有元数据和图像数据的字节数组

byte[] pngjdata = writeMetaDataInPNGImage(img.getAsBufferedImage(),"key", "hello");
如果我用
pngjdata[]
保存图像,我可以看到图像中的元数据,但是如果我从这个字节数组创建
buffereImage
并保存它,我看不到写入的元数据

InputStream in1 = new ByteArrayInputStream(pngjdata);
BufferedImage brImage = ImageIO.read(in1);
为什么
brImage
没有我写的元数据

为什么
brImage
没有我写的元数据

buffereImage
不包含您要查找的元数据。
buffereImage
实例仅表示像素值、颜色模型、样本模型等,或者换句话说,表示显示图像所需的数据。也没有用于设置/获取元数据的API(但您可能被
getProperty(name)
和继承自遗留AWT
Image
API的相关方法弄糊涂了)

ImageIO
API中的元数据表示为
iimetadata
的实例,它是各种类似DOM的形式,您可以通过
getAsTree(…)
方法获得(如
“javax\u ImageIO\u png\u 1.0”
用于png,或“标准”
“javax\u ImageIO\u 1.0”
格式)

要在应用程序中同时组织像素数据和元数据,可以使用
IIOImage


您可以使用该方法同时读取像素数据和元数据。您可以同时写入这两个数据,就像上面一样(请注意,
write
方法的第一个参数是流元数据,它不同于图像元数据,对于PNG,只需传递
null

我更新了代码,想法是返回带有元数据的缓冲图像@哈拉尔德