0

私は、たくさんの tiff を取り込んでそれらをまとめるプログラムを書いています。読み込んだほとんどの画像ファイルで機能するようになりましたが、それらを読み込もうとすると、大量の画像ファイルでエラーが発生します。

これが私が持っているコードのスニペットです:

int numPages = 0;           
inStream = ImageIO.createImageInputStream(imageFile);
reader.setInput(inStream);

while(true){
    bufferedImages.add(reader.readAll(numPages, reader.getDefaultReadParam()));
    numPages++;
}

はい、範囲外の例外をキャッチするので、心配する必要はありません。私の問題は、次のエラーが発生することです。

javax.imageio.IIOException: イメージ メタデータの読み込み中に I/O エラーが発生しました! com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.readMetadata(TIFFImageReader.java:340) com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.seekToImage(TIFFImageReader.java:310) com.sun .media.imageioimpl.plugins.tiff.TIFFImageReader.prepareRead(TIFFImageReader.java:971) at com.sun.media.imageioimpl.plugins.tiff.TIFFImageReader.read(TIFFImageReader.java:1153) at javax.imageio.ImageReader.readAll (ImageReader.java:1067) で sel.image.appender.ImageAppender.mergeImages(ImageAppender.java:59) で sel.imagenow.processor.AetnaLTCProcessor.processBatch(AetnaLTCProcessor.java:287) で sel.imagenow.processor.AetnaLTCProcessor. sel.processor.AbstractImageNowProcessor の processImpl(AetnaLTCProcessor.java:81)。

原因: com.sun.media.imageioimpl の javax.imageio.stream.ImageInputStreamImpl.readUnsignedShort(ImageInputStreamImpl.java:242) の javax.imageio.stream.ImageInputStreamImpl.readShort(ImageInputStreamImpl.java:229) での java.io.EOFException .plugins.tiff.TIFFIFD.initialize(TIFFIFD.java:194) at com.sun.media.imageioimpl.plugins.tiff.TIFFImageMetadata.initializeFromStream(TIFFImageMetadata.java:110) at com.sun.media.imageioimpl.plugins.tiff .TIFFImageReader.readMetadata(TIFFImageReader.java:336) ... 9 もっと見る

正しい JAI ライブラリを追加したことを確認しました。リーダーは「TIFF」タイプを使用しているため、リーダー (およびライター) は正しいのですが、何らかの理由でメタデータが間違っています。これで、これらすべての画像を Windows で通常どおり開いて表示できるようになったので、画像が実際に破損することはありません。Javaはそれらを正しく読みたくないだけです。私はストリーム metadata を使用して後でそれらを書き出すだけなので、メタデータについてはあまり気にしません。ファイルをリストに読み込んで追加できるようにするだけです。ライターで writer.replaceImageMetaData メソッドを見つけましたが、IOWriter の TIFFwriter バージョンにはそのコードがありません。私は立ち往生しています、誰か何か?メタデータの一部を読み取って何が問題なのかを確認し、修正する方法はありますか?

4

1 に答える 1

1

知りたい人のために、私は自分の問題を修正しました。画像のメタデータが少し間違っていたようです。私は単純なマージを行っていたので、各画像が 1 ページであることを知っていたので、バッファリングされた画像を使用して画像を読み取り、それを null メタデータを持つ IIOImage にすることができました。ストリーム メタデータ (機能した) を使用して画像をマージしました。画像のリストをマージするために使用する完全な方法を次に示します。

public static File mergeImages(List<File> files, String argID, String fileType, String compressionType) throws Exception{

    //find the temp location of the image
    String location = ConfigManager.getInstance().getTempFileDirectory();
    logger_.debug("image file type [" + fileType + "]");
    ImageReader reader = ImageIO.getImageReadersByFormatName(fileType).next();
    ImageWriter writer = ImageIO.getImageWritersByFormatName(fileType).next();
    //set up the new image name
    String filePath = location + "\\" + argID +"." + fileType;
    //keeps track of the images we copied from
    StringBuilder builder = new StringBuilder();
    List<IIOImage> bufferedImages = new ArrayList<IIOImage>();
    IIOMetadata metaData = null;
    for (File imageFile:files) {

        //get the name for logging later
        builder.append(imageFile.getCanonicalPath()).append("\n");
        if (metaData == null){
            reader.setInput(ImageIO.createImageInputStream(imageFile));
            metaData = reader.getStreamMetadata();

        }

        BufferedImage image = ImageIO.read(imageFile);
        bufferedImages.add(new IIOImage(image, null, null));
    }


    ImageWriteParam params = writer.getDefaultWriteParam();
    if (compressionType != null){
        params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        params.setCompressionType(compressionType);
    }

    ImageOutputStream outStream = null;

    try{
        outStream = ImageIO.createImageOutputStream(new File(filePath));
        int numPages = 0;
        writer.setOutput(outStream);
        for(IIOImage image:bufferedImages){
            if (numPages == 0){
                writer.write(metaData, image, params);
            }
            else{
                writer.writeInsert(numPages, image, params);
            }
            numPages++;
        }
    }
    finally{
        if (outStream != null){
            outStream.close();
        }

    }

    //set up the file for us to use later
    File mergedFile = new File(filePath);

    logger_.info("Merged image into [" + filePath + "]");
    logger_.debug("Merged images [\n" + builder.toString() + "] into --> " + filePath);

    return mergedFile;

}

この問題について私が見つけることができるものはあまりないことを知っているので、これが他の誰かに役立つことを願っています.

于 2013-08-13T12:15:48.300 に答える