java - 创建 BufferedImage 后元数据丢失

标签 java metadata inputstream bufferedimage 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;
}

写入元数据后,我将返回带有元数据和图像数据的字节数组。

byte[] pngjdata = writeMetaDataInPNGImage(img.getAsBufferedImage(),"key", "hello");

如果我用 pngjdata[] 保存图像,我可以看到图像内的元数据,但是如果我从这个字节数组创建 BufferedImage 并保存它,我我没有看到书面元数据。

InputStream in1 = new ByteArrayInputStream(pngjdata);
BufferedImage brImage = ImageIO.read(in1);

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

最佳答案

Why is brImage not having the meta data written by me?

BufferedImage 不包含您正在查找的元数据。 BufferedImage 实例仅表示像素值、颜色模型、样本模型等,或者换句话说,显示图像所需的数据。也没有用于设置/获取元数据的 API(但您可能会对从旧版 AWT Image API 继承的 getProperty(name) 和相关方法感到困惑)。

ImageIO API 中的元数据表示为 IIOMetadata 的实例,您可以通过 getAsTree(..)< 获取各种类似 DOM 的形式 方法(如 PNG 的 "javax_imageio_png_1.0" 或“标准”"javax_imageio_1.0" 格式)。

要在应用程序中将像素数据和元数据组织在一起,您可以使用 IIOImage 类。

您可以使用 ImageReader.readAll(index, param) 一起读取像素数据和元数据。方法。您可以同时写入两者,使用 ImageWriter.write(null, iioImage, param) ,就像您在上面所做的那样(只需注意 write 方法的第一个参数是 stream 元数据,它与 image元数据,对于 PNG 只需传递 null)。

关于java - 创建 BufferedImage 后元数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35745268/

相关文章:

java - 将变量从一种方法传递到另一种方法时不一致的变量

实现方法的 Java 类具有接口(interface)中指定的子类型的参数

java - 使用 Java 从 xml 文件中提取值

javascript - 如何在嵌套组件中使用 "groups"访问 "class-transformer"

sqlite - 如何从 sqlite 表的元数据中获取表是否自动递增?

mysql - 将简单的元数据附加到 MySQL 数据库

Java流套接字只能发送一次

java - 我有一段代码,即带有 try 和 catch block 的方法。 catch block 捕获异常,我该如何为其编写失败 junit?

Java 在类方法中抛出异常

java - 基本的java套接字编程问题