何をする必要があるか
画像ファイルにカスタム メタ情報を追加する必要があります。
サポートされているタイプは、JPEG、GIF、BMP、TIF、PNG である必要があります。
それはどのように行われますか
すべてのファイル タイプに汎用的なソリューションを提供するために、imageio Standard メタデータを使用することにしました。
すべてのファイル タイプが一般的な API でサポートされているわけではないため、Java Advanced Imaging ライブラリも使用しています。
メタデータを追加するコア関数のコード スニペットを次に示します。
public static byte[] writeCustomMetaInformation(byte[] imageByteArray, String contentType) throws IOException {
ImageWriter writer = null;
String formatName = "javax_imageio_1.0";
ImageOutputStream stream = null;
if (contentType.toLowerCase().contains("gif")) {
IIORegistry registry = IIORegistry.getDefaultInstance();
registry.registerServiceProvider(new GIFImageWriterSpi());
writer = ImageIO.getImageWritersByFormatName("gif").next();
} else if (contentType.toLowerCase().contains("png")) {
writer = ImageIO.getImageWritersByFormatName("png").next();
} else if (contentType.toLowerCase().contains("bmp")) {
IIORegistry registry = IIORegistry.getDefaultInstance();
registry.registerServiceProvider(new BMPImageWriterSpi());
writer = ImageIO.getImageWritersByFormatName("bmp").next();
} else if (contentType.toLowerCase().contains("tif")) {
IIORegistry registry = IIORegistry.getDefaultInstance();
registry.registerServiceProvider(new TIFFImageWriterSpi());
writer = ImageIO.getImageWritersByFormatName("tif").next();
} else { //by default jpeg
writer = ImageIO.getImageWritersByFormatName("jpeg").next();
}
BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageByteArray));
ImageWriteParam writeParam = writer.getDefaultWriteParam();
ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
/*
* Add metadata to the file
* See http://docs.oracle.com/javase/6/docs/api/javax/imageio/metadata/doc-files/standard_metadata.html
* for reference on default image metadata DTD
*/
IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
IIOMetadataNode root = new IIOMetadataNode(formatName);
//Add RGB tag, otherwise BMP writing throws NPE
IIOMetadataNode chroma = new IIOMetadataNode("Chroma");
IIOMetadataNode colorSpaceType = new IIOMetadataNode("ColorSpaceType");
colorSpaceType.setAttribute("name", "RGB");
chroma.appendChild(colorSpaceType);
root.appendChild(chroma);
IIOMetadataNode text = new IIOMetadataNode("Text");
IIOMetadataNode textEntry = new IIOMetadataNode("TextEntry");
textEntry.setAttribute("keyword", "metainformation");
textEntry.setAttribute("value", "This is some custom meta information!");
textEntry.setAttribute("encoding", "UTF-8");
textEntry.setAttribute("language", "EN");
textEntry.setAttribute("compression", "none");
text.appendChild(textEntry);
root.appendChild(text);
metadata.mergeTree(formatName, root);
// writing the data
ByteArrayOutputStream baos = new ByteArrayOutputStream();
stream = ImageIO.createImageOutputStream(baos);
writer.setOutput(stream);
IIOImage img = new IIOImage(bufferedImage, null, metadata);
writer.write(metadata, img, writeParam);
stream.close();
return baos.toByteArray();
}
結果はどうですか
ImageMagickのidentify -verboseを使用して、メタ情報を追加した結果を表示します。
- JPG、PNG、GIF ファイルにはメタ情報が追加されています
- BMP と TIF にはメタ情報が追加されていないか、ImageMagick が読み取れません。
では、BMP や TIF に追加されたメタ情報が有効にならない理由を知っている人はいますか? 標準メタデータ DTD は適用されませんか? 代わりに BMP/TIF メタデータを使用する必要がありますか?
動作をテストしたい場合は 、変換とその問題を示す完全にセットアップされたプロジェクトへのリンクを次に示します。