multi-pag tif到几个jpeg文件(java)

时间:2016-08-23 18:09:54

标签: java jpeg tiff jai

您好我能够使用以下代码将tif文件转换为jpeg

https://stackoverflow.com/questions/15429011/how-to-convert-tiff-to-jpeg-png-in-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 个答案:

答案 0 :(得分:0)

这将采用多页TIFF文件(在SeekableStream中),提取页面数组中的页面(例如“1”,“3”,“4”)并将它们写入单个多页tiff进入文件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");
}