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
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) {
}
}
}
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.
- 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.
- Tạo lớp(class) encode để xử lý loại dạng nén của hình tif.
- Thiết lập loại dạng nén của hình 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