更新 PNG 元数据

问题描述 投票:0回答:1

我正在尝试向元数据添加信息,我编写了以下代码:

ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);

//adding metadata
javax.imageio.metadata.IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);

IIOMetadataNode textEntry = new IIOMetadataNode("tEXtEntry");
textEntry.setAttribute("keyword", "Title");
textEntry.setAttribute("value", "1515456165165165656565165");

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);

BufferedImage image = ImageIO.read(tempFile);

//writing the data
IIOImage iioImage = new IIOImage(image, null, metadata);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream stream = ImageIO.createImageOutputStream(baos);
writer.setOutput(stream);
writer.write(metadata, new IIOImage(image, null, metadata), writeParam);

File file1 = new File("C:/Users/Akiro/Desktop/Новая папка/Раб/тесты/new.png");

try {
    ImageIO.write(image, "png", file1);
} catch (Exception e) {
    e.printStackTrace();
}

stream.close();

上面的代码执行没有错误,但元数据中没有出现任何变化。

可能是什么错误,或者执行此操作的最佳方法是什么(最好有示例)?

java png metadata javax.imageio
1个回答
0
投票

正如评论中提到的,代码的问题在于它将同一张图像写入了两次。一次到内存中的流,带有自定义元数据。一旦进入文件,没有自定义元数据。

相反,只将元数据写入文件一次:

// Create custom metadata
IIOMetadataNode root = new IIOMetadataNode("javax_imageio_png_1.0");

IIOMetadataNode text = new IIOMetadataNode("tEXt");
root.appendChild(text);

IIOMetadataNode textEntry = new IIOMetadataNode("tEXtEntry");
textEntry.setAttribute("keyword", "Title");
textEntry.setAttribute("value", "your-title-here");
text.appendChild(textEntry);

// Read image data
BufferedImage image = ImageIO.read(inputFile);

// Merge with default PNG metadata
// (Note: You could also read the metadata from the inputFile and merge with that, 
// to preserve existing metadata. I'm assuming you just want to replace everything).
ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromRenderedImage(image);

IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
metadata.mergeTree("javax_imageio_png_1.0", root);

// Write image with metadata to outputFile
File outputFile = new File("new.png");

try (ImageOutputStream stream = ImageIO.createImageOutputStream(outputFile)) (
    writer.setOutput(stream);
    writer.write(null, new IIOImage(image, null, metadata), writeParam);
} catch (Exception e) {
    e.printStackTrace();
}
© www.soinside.com 2019 - 2024. All rights reserved.