Метаданные изображения не копируются из JPEG в TIF-файл с использованием Java ImageIO и двенадцати monkeys - PullRequest
0 голосов
/ 21 мая 2019

Когда я пытаюсь скопировать содержимое файла «.jpg» в новый файл «.tif», IIOMetadata не сохраняется. Основные теги метаданных, которые мне нужны, это: CompressionTypeName, horizontalPixelSize и VerticalPixelSize.
Это упрощенный код процесса копирования:

public void stackOverflowQuestion(File fileToRead) {
    ImageReader reader; 
    ImageWriter writer=null;
    FileImageInputStream fileImageInputStream;
    BufferedImage bufferedImageReadImage;
    IIOMetadata iioMetadataReadImage;
    IIOMetadata iioMetaDataImageToWrite;
    IIOImage iioImage;
    ImageWriteParam imageWriteParams;
    ImageReadParam imageReadParam;
    File newFile;
    ImageTypeSpecifier imageTypeSpecifierDestino;

    reader = this.createImageReaderBySuffix("jpg");//(parameter’s extension)
    try {
        fileImageInputStream=new FileImageInputStream(fileToRead);
        reader.setInput(fileImageInputStream);
        writer = ImageIO.getImageWritersBySuffix("tif").next();
        imageReadParam=reader.getDefaultReadParam();
        bufferedImageReadImage = reader.read(0,imageReadParam);
        iioMetadataReadImage = reader.getImageMetadata(0);
        if (bufferedImageReadImage!=null) {
            newFile =getNewFile();//simply gets a new empty file.
            writer.setOutput(new FileImageOutputStream(newFile));
            writer.prepareWriteSequence(null);
            imageTypeSpecifierDestino = ImageTypeSpecifier.createFromBufferedImageType(bufferedImageReadImage.getType());
            imageWriteParams = (ImageWriteParam) writer.getDefaultWriteParam();
            imageWriteParams.setDestinationType( ImageTypeSpecifier.createFromBufferedImageType( bufferedImageReadImage.getType()) ) ;
            imageWriteParams.setCompressionMode( ImageWriteParam.MODE_COPY_FROM_METADATA );
            iioMetaDataImageToWrite= writer.convertImageMetadata(iioMetadataReadImage, imageTypeSpecifierDestino, imageWriteParams);
            //at this point, the metadata is spoiled
            iioImage=new IIOImage(bufferedImageReadImage, null, iioMetaDataImageToWrite);
            writer.writeToSequence(iioImage, imageWriteParams);
        }
    } catch (Exception e) {
}

Это метаданные, включенные в формат "javax_imageio_1.0", включенный в прочитанный файл .jpg:

<javax_imageio_1.0>
<Chroma>
    <ColorSpaceType name="YCbCr"/>
    <NumChannels value="3"/>    
</Chroma>
<Compression>
    <CompressionTypeName value="JPEG"/>
    <Lossless value="FALSE"/>
    <NumProgressiveScans value="1"/>
</Compression>
<Dimension>
    <PixelAspectRatio value="1.0"/>
    <ImageOrientation value="normal"/>
    <HorizontalPixelSize value="0.16933332"/>
    <VerticalPixelSize value="0.16933332"/>
</Dimension>

Это метаданные, включенные в то же имя формата "javax_imageio_1.0", которые были записаны моей программой в файл .tif

<javax_imageio_1.0>
<Chroma>
    <ColorSpaceType name="RGB"/>
    <NumChannels value="1"/>
    <BlackIsZero/>
</Chroma>
<Compression>
    <CompressionTypeName value="None"/>
</Compression>
<Data>
    <PlanarConfiguration value="PixelInterleaved"/>
    <SampleFormat value="UnsignedIntegral"/>
    <BitsPerSample value="1"/>
     <SampleMSB value="0"/>
</Data>
<Dimension>
    <PixelAspectRatio value="1.0"/>
        <HorizontalPixelSize value="5.905523436069756"/>
        <VerticalPixelSize value="5.905523436069756"/>
</Dimension>    
<Document>
    <FormatVersion value="6.0"/>
</Document>

Значения CompressionTypeName, HorizontalPixelSize и VerticalPixelSize были потеряны или изменены.

...