Multi-Pag TIF для нескольких файлов JPEG (Java)

Здравствуйте, я смог преобразовать TIF-файл в JPEG с помощью следующего кода, который я получил от

/questions/15498539/kak-konvertirovat-tiff-v-jpegpng-v-java

String inPath = "./tifTest/113873996.002.tif";
String otPath = "./tifTest/113873996.002-0.jpeg";

BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
    input = new BufferedInputStream(new FileInputStream(inPath), DEFAULT_BUFFER_SIZE);
    output = new BufferedOutputStream(new FileOutputStream(otPath), DEFAULT_BUFFER_SIZE);

    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    int length;
    while ((length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }

} catch (FileNotFoundException ex) {
    Logger.getLogger(TifToJpeg.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
    Logger.getLogger(TifToJpeg.class.getName()).log(Level.SEVERE, null, ex);
} finally {
    try {
        output.flush();
        output.close();
        input.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Это работает только с одностраничным TIF-файлом, и когда я использую его с многостраничным TIF-файлом, он сохраняет только первую страницу.

Как я могу изменить это, чтобы сохранить mymultipagetif.tif в:

  • mymultipagetif-0.jpeg
  • mymultipagetif-1.jpeg
  • mymultipagetif-2.jpeg

Спасибо!

1 ответ

Это займет многостраничный файл TIFF (в SeekableStream), извлечет страницы из массива страниц (например, "1", "3", "4") и запишет их в один многостраничный файл в файл. outTIffFileName. Изменить по желанию.

private String _ExtractListOfPages (SeekableStream ss, String outTiffFileName, String[] pages){
    // pageNums is a String array of 0-based page numbers.
    try {
        TIFFDirectory td = new TIFFDirectory(ss, 0);
        if (debugOn) {
            System.out.println("Directory has " + Integer.toString(td.getNumEntries()) +  " entries");
            System.out.println("Getting TIFFFields");
            System.out.println("X resolution = " +  Float.toString(td.getFieldAsFloat(TIFFImageDecoder.TIFF_X_RESOLUTION)));
            System.out.println("Y resolution = " +  Float.toString(td.getFieldAsFloat(TIFFImageDecoder.TIFF_Y_RESOLUTION)));
            System.out.println("Resolution unit = " +  Long.toString(td.getFieldAsLong(TIFFImageDecoder.TIFF_RESOLUTION_UNIT)));
            }
        ImageDecoder decodedImage = ImageCodec.createImageDecoder("tiff", ss, null);
        int count = decodedImage.getNumPages();
        if (debugOn) { System.out.println("Input image has " + count + " page(s)"); }
        TIFFEncodeParam param = new TIFFEncodeParam();
        TIFFField tf = td.getField(259); // Compression as specified in the input file
        param.setCompression(tf.getAsInt(0)); // Set the compression of the output to be the same.
        param.setLittleEndian(false); // Intel
        param.setExtraFields(td.getFields());
        FileOutputStream fOut = new FileOutputStream(outTiffFileName);
        Vector<RenderedImage> vector = new Vector<RenderedImage>();
        RenderedImage page0 = decodedImage.decodeAsRenderedImage(Integer.parseInt(pages[0]));
        BufferedImage img0 = new BufferedImage(page0.getColorModel(), (WritableRaster)page0.getData(), false, null);
        int pgNum;
// Adding the extra pages starts with the second one on the list.
        for (int i = 1; i < pages.length; i++ ) {
            pgNum = Integer.parseInt(pages[i]);
            if (debugOn) { System.out.println ("Page number " + pgNum); }
            RenderedImage page = decodedImage.decodeAsRenderedImage(pgNum);
            if (debugOn) { System.out.println ("Page is " + Integer.toString(page.getWidth()) + " pixels wide and "+ Integer.toString(page.getHeight()) + " pixels high."); }
            if (debugOn) { System.out.println("Adding page " + pages[i] + " to vector"); }
            vector.add(page);
        }
        param.setExtraImages(vector.iterator());
        ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", fOut, param);
        if (debugOn) { System.out.println("Encoding page " + pages[0]); }
        encoder.encode(decodedImage.decodeAsRenderedImage(Integer.parseInt(pages[0])));
        fOut.close();
    } catch (Exception e) {
        System.out.println(e.toString());
        return("Not OK " + e.getMessage());
    }
    return ("OK");
}
Другие вопросы по тегам