实用Java:将tif转换成jpg并缩放

用Java来执行某些任务实在是出奇的简单, 比某些脚本语言还要管用, Java有强大的jar文件, 基本上你想要解决的问题都有现成的解决方案, 下面的代码解决一个实际的问题:将tif转换成jpg并缩放到指定的比例.

首先要import下面的jar. jar文件到oracle官方网站上去下.

import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;

import com.sun.media.jai.codec.BMPEncodeParam;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.sun.media.jai.codec.TIFFEncodeParam;

下面的函数接受一个tif文件名,生成一个jpg文件,并返回其文件名:

public String ConvertTif(String filename) {
        //生成不重复的文件名
        String jpgname filename.replace(".tif"".jpg");
        String alternateName jpgname;
        int 0;
        while(file_exists(alternateName)) {alternateName i+jpgnamei++;}
        
        //now alternateName would be final file name to be saved. and we should return that
        try {
            RenderedOp src JAI.create("fileload",filename);
            OutputStream os new FileOutputStream(alternateName);
            JPEGEncodeParam param2 new JPEGEncodeParam();
            ImageEncoder enc2 ImageCodec.createImageEncoder("JPEG"os,param2);
            enc2.encode(src);
            os.close();
        catch (Exception e) {
            e.printStackTrace();
        }
        return alternateName;
    }

需要注意的是有些tif文件会有超过3个颜色通道, 此时生成jpg文件会报错, 暂时还没有解决办法.

TIF文件无法直接缩放, 所以要先转为jpg, 然后再缩放.

public String ZoomImg(String filename) {
    String LargeImg "large"+filename;
    try {
            
        FileInputStream fis new FileInputStream(filename);
        BufferedImage bfimg ImageIO.read(fis);
        int width new Double(bfimg.getWidth()).intValue();
        int height new Double(bfimg.getHeight()).intValue();
        if(width 500return filename;
        
        
        //宽度500
        int newheight = (500*height)/width;
        BufferedImage bfimgout new BufferedImage(500,newheight,BufferedImage.TYPE_3BYTE_BGR);
        Graphics graphics bfimgout.createGraphics();
        graphics.drawImage(bfimg.getScaledInstance(500,newheight,Image.SCALE_SMOOTH),0,0,null);
        ImageIO.write(bfimgout"jpg"new File(LargeImg));
        fis.close();
    catch (Exception e) {
        e.printStackTrace();
        //不可以直接缩放tif
    }
        
    File f new File(filename);
    f.delete();
    return LargeImg;
    
}

Java拥有作为脚本语言的能力, 尽管不是解释性而是需要编译的, 但是有如此丰富了jar包可用, 在某些场合反而是最敏捷最方面的解决方案.