为Tiff图像填充IIoMetadata

时间:2018-07-09 00:55:18

标签: java image metadata tiff javax.imageio

我想填充新的tiff图像的元数据。我知道以下代码将缓冲后的图像写入byte []中,并压缩为“ JPEG”方法,然后将其压缩为90(0-100)。

some_numbers =[1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77]
new_string = []
print('some_numbers string: ',some_numbers)
print('new_string string: ',new_string)
#pop the last variable and insert into 'new_string'
new_string.insert(-1,some_numbers[-1])
#begin loop
while some_numbers:    
    #insert the pops from some_numbers into new string in a reverse order
    new_string.insert(-1,some_numbers.pop())
#delete redundant number at the end of list
del new_string[-1]
print("some_numbers string: ",some_numbers)  
print("reversed string: ",new_string)

现在,我要填充此.tif的元数据。到目前为止,我已完成以下操作:

ImageIO.scanForPlugins();
TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi();
javax.imageio.ImageWriter writerIO = tiffspi.createWriterInstance();
ImageWriteParam param = writerIO.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("JPEG");
param.setCompressionQuality(90.);

File fOutputFile = new File(my saving route for the .tif);
ImageOutputStream ios = ImageIO.createImageOutputStream(fOutputFile);
writerIO.setOutput(ios);
writerIO.write(null, new IIOImage(my BufferedImage, null, null), param);
writerIO.dispose();
ios.flush();
ios.close();

其中metaseries是一个Hashtable,我将元数据信息作为键和值。 load_metadata是以下函数:

IIOMetadata metadata = writerIO.getDefaultImageMetadata(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY), param);

metadata.setFromTree(metadata.getNativeMetadataFormatName(),load_metadata(metadata.getAsTree(metadata.getNativeMetadataFormatName()),metaseries));

要添加此元数据,我只需使用以下方式更改writerIO.write:

public Node load_metadata(Node rootIOMetadata, Hashtable<String, Object> metadata){     
    IIOMetadataNode n = new IIOMetadataNode("Data");

    //We get all the keys and values
    for(Map.Entry<String, Object> entry: metadata.entrySet()){
        if (!entry.getKey().equals(null)){
            n.setAttribute(entry.getKey().toString(), entry.getValue().toString());
        }
    }
    rootIOMetadata.appendChild(n);

    return rootIOMetadata;
}

但是,我仍然看不到最终图像中的任何元数据。我有两个问题:

  1. 您可以将想要的任何元数据添加到tif图像中吗?还是只是预定义列表的值?
  2. 如何添加元数据?我猜我在添加节点上做错了...

0 个答案:

没有答案