当前位置: 首页 > 面试题库 >

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

归明诚
2023-03-14
问题内容

我想将元数据写入创建的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中设置jpeg图像的dpi元数据。图像的来源是扫描仪,因此我从TWAIN获得了水平/垂直分辨率以及图像原始数据。我想保存此信息以获得更好的打印效果。 这是我到目前为止的代码。它将原始图像(byteArray)保存为JPEG文件,但忽略了我通过IIOMetadata指定的X / Ydensity信息。有什么建议我做错了吗? 任何其他解决方案(第三方库等)也将受到

  • 问题内容: 我正在开发一个有关图像处理的项目,在该项目中,我必须填充破裂绘画的数字化图像。我必须将彩色图像转换为灰度图像,对灰度图像的2D数组执行一些计算,然后将其写回灰度图像。此代码是: 但是输出的图像要暗得多,我没有找回原始图像(我还没有做任何更改)。 我认为setRGB()语句中应该有一些更改,但我不知道是什么。 为了写回图像,我也尝试过: ` ` 但这也不会给我原始图像。 谁能提供我这个问

  • 问题内容: 什么是最好的Java图像处理库/方法?[关闭]我同时使用JAI媒体API和ImageMagick吗? ImageMagick存在一些可伸缩性问题,基于JNI的JMagick也没有吸引力。与ImageMagick相比,JAI执行大小调整操作时的质量结果较差。 有谁知道过任何出色的开源或商业工具,它们都是本机Java并可以提供高质量的结果? 问题答案: 我知道这个问题已经很老了,但是随着新

  • 我想编辑docker图像元数据,原因如下: > 我不喜欢一个图像父母EXPOSE,VOLUME等声明(见#3465,Docker-Team不想提供解决方案),所以我想“取消卷”或“取消曝光”图像。 我不喜欢一个图像(参见),因为它是使用从运行的容器生成的 修复或过程中出现的错误,例如: 我有办法做到吗?

  • 问题内容: 我尝试了以下代码来完成读取和写入tiff图像的任务: 但是,当我运行代码时,出现以下错误消息: 知道如何解决这个问题吗? 问题答案: 读取TIFF并输出BMP的最简单方法是使用ImageIO类: 要使此功能正常工作,您唯一需要做的另一件事是确保已将JAI ImageIO JAR添加到类路径中,因为如果没有此库中的插件,JRE不会处理BMP和TIFF。 如果由于某种原因不能使用JAI I

  • 我目前正在编写一个应用程序来读取TIFF文件,然后执行一些压缩算法。我已经成功地做到了这一点...但是现在,我想读取TIFF图像的元数据,但似乎找不到正确的方法。 我应该使用什么库和函数?