Java - Chuyển đổi hình tif nhiều trang thành nhiều hình tif một trang.(Convert a multi-page TIF into single-page TIF)



Bài viết này sẽ tiếp tục giới thiệu cách xử lý hình TIF với JAI package. Để hiểu về gói JAI bạn có thể tham khảo các bài viết về Java Advanced Imaging.

Trong bài này tôi sẽ hướng dẫn cách chuyển đổi một hình tif có nhiều trang thành các hình TIF có 1 trang.

Trước tiên ta cần hiểu tập tin TIF là một dạng file dùng để chứa(hoặc nén) nhiều hình lại thành một tập tin duy nhất. Hiểu đơn giản thì nó giống như thùng chứa hình(container) vậy.



Theo thông tin tôi tìm hiểu được thì tập tin TIF sẽ có các dạng nén sau:
  • None
  • LZW
  • Packbits
  • JPEG
  • ZIP
  • Huffman RLE
  • CCITT Fax 3
  • CCITT Fax 4
Định nghĩa các bạn chịu khó lên chú google hỏi nha, tôi cũng làm biếng tìm hiểu sâu vào lắm.

Tiếp theo bạn download một số thư việc JAI và hình tif để thực hành bài viết này.

jai-core-1.1.3-alpha.jar
jai_codec-1.1.3-alpha.jar
Image_Tif_Demo.tif

Dưới đây là một đoạn mã đơn giản(simple source code) để thực hiện việc chuyển đổi hình tif nhiều trang thành nhiều hình tif 1 trang.
import java.io.*;

import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.TIFFEncodeParam;

import java.awt.image.RenderedImage;
import javax.media.jai.RenderedOp;
import javax.media.jai.JAI;
import java.awt.image.renderable.ParameterBlock;

/**
 * @(#)Convert_multi_TIF_to_single_TIF.java
 *
 * Convert_multi_TIF_to_single_TIF application
 *
 * @author developer.bnson@gmail.com
 * @version 1.00 2013/7/28
 */

public class Convert_multi_TIF_to_single_TIF {
  
    public static void main(String[] args) {
      
        // TODO, add your application code
        convert("D:/Tutorials/Java_Tutorial/JAVA_Data/JPEG.tif");
    }
  
    private static void convert(String path) {
        try {
            FileSeekableStream ss = new FileSeekableStream(path);
            ImageDecoder dec = ImageCodec.createImageDecoder("tiff", ss, null);
            int count = dec.getNumPages();
            TIFFEncodeParam param = new TIFFEncodeParam();
            param.setCompression(TIFFEncodeParam.COMPRESSION_JPEG_TTN2);
            param.setLittleEndian(false); // Intel
            System.out.println("This TIF has " + count + " image(s)");
            for (int i = 0; i < count; i++) {
                RenderedImage page = dec.decodeAsRenderedImage(i);
                File f = new File("D:/single_" + i + ".tif");
                System.out.println("Saving " + f.getCanonicalPath());
                ParameterBlock pb = new ParameterBlock();
                pb.addSource(page);
                pb.add(f.toString());
                pb.add("tiff");
                pb.add(param);
                RenderedOp r = JAI.create("filestore",pb);
                r.dispose();
            }          
        } catch (IOException ex) {
          
        }
    }
      
}

convert("D:/Tutorials/Java_Tutorial/JAVA_Data/JPEG.tif");
  • Gọi hàm convert và điền thông tin hình tif nhiều trang để thực hiện quá trình chuyển đổi.
FileSeekableStream ss = new FileSeekableStream(path);
  • Truyền thông tin hình tif nhiều trang vào lớp(class) để tiến hành xử lý hình tif nhiều trang.
TIFFEncodeParam param = new TIFFEncodeParam();
  • Tạo lớp(class) encode để xử lý loại dạng nén của hình tif.
param.setCompression(TIFFEncodeParam.COMPRESSION_JPEG_TTN2);
  • Thiết lập loại dạng nén của hình tif.
File f = new File("D:/single_" + i + ".tif");
  • Tạo đường dẫn và tên lưu trữ khi hình tif nhiều trang được tách ra thành hình tif 1 trang.

Trường hợp trong quá trình chạy code bạn gặp lỗi "Bug One factory fails for the operation encode." thì tham khảo bài viết Java - Bug One factory fails for the operation encode. để xử lý.












No comments:

Post a Comment