java 压缩图片实例

</pre><pre name="code" class="java">/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package test;


import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;


import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.RenderedOp;


import org.aspectj.util.FileUtil;


import com.minxinloan.common.utils.FileUtils;
import com.minxinloan.common.utils.StrUtils;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.media.jai.codec.BMPEncodeParam;
import com.sun.media.jai.codec.FileSeekableStream;
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;


/**
 * 
 * @author
 */
public class CompressPic3 {
class MyThread extends Thread {
public long minl = 0;
public long maxl = 99999999L;


public MyThread(long minl, long maxl) {
this.minl = minl;
this.maxl = maxl;
}


public void run() {
CompressPic3.COUNT++;
System.out.println("线程启动,共有" + CompressPic3.COUNT + "个线程!");
System.out.println("min:"+minl+"  maxl:" + maxl);
rootDir("E:\\backup\\", "F:\\backup\\", minl, maxl);
CompressPic3.COUNT--;
}
}


public static int COUNT = 0;
private File file = null; // 文件对象
private String inputDir; // 输入图路径
private String outputDir; // 输出图路径
private String inputFileName; // 输入图文件名
private String outputFileName; // 输出图文件名
private int outputWidth = 100; // 默认输出图片宽
private int outputHeight = 100; // 默认输出图片高
private boolean proportion = true; // 是否等比缩放标记(默认为等比缩放)


public CompressPic3() { // 初始化变量
inputDir = "";
outputDir = "";
inputFileName = "";
outputFileName = "";
outputWidth = 100;
outputHeight = 100;
}


public void setInputDir(String inputDir) {
this.inputDir = inputDir;
}


public void setOutputDir(String outputDir) {
this.outputDir = outputDir;
}


public void setInputFileName(String inputFileName) {
this.inputFileName = inputFileName;
}


public void setOutputFileName(String outputFileName) {
this.outputFileName = outputFileName;
}


public void setOutputWidth(int outputWidth) {
this.outputWidth = outputWidth;
}


public void setOutputHeight(int outputHeight) {
this.outputHeight = outputHeight;
}


public void setWidthAndHeight(int width, int height) {
this.outputWidth = width;
this.outputHeight = height;
}


/*
* 获得图片大小 传入参数 String path :图片路径
*/
public long getPicSize(String path) {
file = new File(path);
return file.length();
}


// 图片处理
public String compressPic() {
try {
// 获得源文件
// file = new File(inputDir + inputFileName);
file = new File(inputFileName);
if (!file.exists()) {
return "";
}
Image img = ImageIO.read(file);
if ( inputFileName.endsWith("tif") || inputFileName.endsWith("tiff")){
// try {
// CompressImage(inputFileName,"高");
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
tifToJpg(inputFileName, inputFileName);
}
// 判断图片格式是否正确
if (img == null || img.getWidth(null) == -1) {
System.out.println(" can't read,retry!" + "<BR>");
return "no";
} else {
int newWidth;
int newHeight;
// 判断是否是等比缩放
if (this.proportion == true) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) img.getWidth(null))
/ (double) outputWidth + 0.1;
double rate2 = ((double) img.getHeight(null))
/ (double) outputHeight + 0.1;
// 根据缩放比率大的进行缩放控制
double rate = rate1 > rate2 ? rate1 : rate2;
newWidth = (int) (((double) img.getWidth(null)) / rate);
newHeight = (int) (((double) img.getHeight(null)) / rate);
} else {
newWidth = img.getWidth(null); // 输出的图片宽度
newHeight = img.getHeight(null); // 输出的图片高度
}
BufferedImage tag = new BufferedImage((int) newWidth,
(int) newHeight, BufferedImage.TYPE_INT_RGB);


/*
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
*/
tag.getGraphics().drawImage(
img.getScaledInstance(newWidth, newHeight,
Image.SCALE_SMOOTH), 0, 0, null);
// FileOutputStream out = new FileOutputStream(outputDir
// + outputFileName);
FileOutputStream out = new FileOutputStream(outputFileName);
// JPEGImageEncoder可适用于其他图片类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
return "ok";
}


public String compressPic(String inputDir, String outputDir,
String inputFileName, String outputFileName) {
// 输入图路径
this.inputDir = inputDir;
// 输出图路径
this.outputDir = outputDir;
// 输入图文件名
this.inputFileName = inputFileName;
// 输出图文件名
this.outputFileName = outputFileName;
return compressPic();
}


public String compressPic(String inputDir, String outputDir,
String inputFileName, String outputFileName, int width, int height,
boolean gp) {
// 输入图路径
this.inputDir = inputDir;
// 输出图路径
this.outputDir = outputDir;
// 输入图文件名
this.inputFileName = inputFileName;
// 输出图文件名
this.outputFileName = outputFileName;
// 设置图片长宽
setWidthAndHeight(width, height);
// 是否是等比缩放 标记
this.proportion = gp;
return compressPic();
}


// main测试
// compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
public static void main(String[] arg) {
// CompressPicDemo mypic = new CompressPicDemo();
// System.out.println("输入的图片大小:" + mypic.getPicSize("e:\\1.jpg")/1024 +
// "KB");
// mypic.compressPic("e:\\", "e:\\test\\", "1.jpg", "r1.jpg", 1020,
// 1020, true);


// FileUtils.unZipFiles("E:\\backup\\20140716030705108-20131225037901002-42329.zip",
// "E:\\backup\\20140716030705108-20131225037901002-42329");
// FileUtils.delFile("E:\\backup\\20140716030705108-20131225037901002-42329.zip");
// //
// FileUtils.zipFiles("e:\\20140717104823336-20130822002201001-24895",
// // "*", "e:\\zgztest.zip");
// String srcDirName =
// "E:\\backup\\20140716030705108-20131225037901002-42329", fileName =
// "*", descFileName =
// "E:\\backup\\20140716030705108-20131225037901002-42329";
// // 判断目录是否存在
// if (srcDirName == null) {
// return;
// }
// File fileDir = new File(srcDirName);
// if (!fileDir.exists() || !fileDir.isDirectory()) {
// return;
// }
// String dirPath = fileDir.getAbsolutePath();
// File descFile = new File(descFileName);
// try {
// if ("*".equals(fileName) || "".equals(fileName)) {
// test(dirPath,descFile);
// } else {
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// FileUtils.zipFiles(dirPath,
// "*", dirPath + ".zip");


// rootDir("F:\\backup\\","F:\\backup2\\",1L,99999999L);
for (Long l = 50114L*1024; l < 59900*1024L;) {
while (true) {
if (CompressPic3.COUNT >= 15) {
continue;
} else {
break;
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread t = new CompressPic3().new MyThread(l, l + 1024000);
t.start();
l = l + 1024000;
}


}


public static void rootDir(String dirOld, String dirPath, Long minl,
Long maxl) {
File file = new File(dirOld);
if (file.isDirectory()) {
File[] files = file.listFiles();
// 空的文件夹
if (files.length == 0) {
// // 目录信息
return;
}


for (int i = 0; i < files.length; i++) {
if (FileUtil.isZipFile(files[i])) {
// 如果是文件
long l = 0;
try {
l = getFileSizes(files[i]);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (l >= minl && l < maxl) {
System.out.println(l);
String newFileStr = dirPath + files[i].getName();
String[] a = newFileStr.split("\\.");
FileUtils.unZipFiles(files[i].getAbsolutePath(), a[0]);
// FileUtils.delFile(files[i].getAbsolutePath());
compressPicDir(a[0], new File(a[0]));
FileUtils.zipFiles(a[0], "*", a[0] + ".zip");
}
}
}


}
}


/**
* 图片压缩处理方法
* 
* @param dirPath
*            要处理的文件夹路径
* @param fileDir
*            要处理的文件
*/
public static void compressPicDir(String dirPath, File fileDir) {
if (fileDir.isDirectory()) {
File[] files = fileDir.listFiles();
// 空的文件夹
if (files.length == 0) {
// // 目录信息
return;
}


for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
// 如果是文件,则调用图片压缩方法
compressPic(dirPath, files[i]);
} else {
// 如果是目录,则递归调用
compressPicDir(dirPath, files[i]);
}
}


}
}


public static long getFileSizes(File f) throws Exception {// 取得文件大小
long s = 0;
if (f.exists()) {
FileInputStream fis = null;
fis = new FileInputStream(f);
s = fis.available();
} else {
f.createNewFile();
System.out.println("文件不存在");
}
return s;
}


/**
* 图片压缩方法
* 
* @param 要处理的文件夹路径
* @param fileDir
*            要处理的文件
*/
public static void compressPic(String dirPath, File fileDir) {
CompressPic3 mypic = new CompressPic3();
String temp = fileDir.getAbsolutePath();
// System.out.println(fileDir.getAbsolutePath());
try {
if (isPicture(temp, null)) {
mypic.compressPic(dirPath, dirPath, temp, temp, 1020, 1020,
true);
}
} catch (Exception e) {
e.printStackTrace();
}
}


/**
* 判断文件是否为图片<br>
* <br>
* 
* @param pInput
*            文件名<br>
* @param pImgeFlag
*            判断具体文件类型<br>
* @return 检查后的结果<br>
* @throws Exception
*/
public static boolean isPicture(String pInput, String pImgeFlag)
throws Exception {
// 文件名称为空的场合
if (StrUtils.isNullOrEmpty(pInput)) {
// 返回不和合法
return false;
}
// 获得文件后缀名
String tmpName = pInput.substring(pInput.lastIndexOf(".") + 1,
pInput.length());
// 声明图片后缀名数组
String imgeArray[][] = { { "bmp", "0" }, { "dib", "1" },
{ "gif", "2" }, { "jfif", "3" }, { "jpe", "4" },
{ "jpeg", "5" }, { "jpg", "6" }, { "png", "7" },
{ "tif", "8" }, { "tiff", "9" }, { "ico", "10" } };
// 遍历名称数组
for (int i = 0; i < imgeArray.length; i++) {
// 判断单个类型文件的场合
if (!StrUtils.isNullOrEmpty(pImgeFlag)
&& imgeArray[i][0].equals(tmpName.toLowerCase())
&& imgeArray[i][1].equals(pImgeFlag)) {
return true;
}
// 判断符合全部类型的场合
if (StrUtils.isNullOrEmpty(pImgeFlag)
&& imgeArray[i][0].equals(tmpName.toLowerCase())) {
return true;
}
}
return false;
}



//===============以下时通过SUN公司提供的 JAI 来完成图像压缩功能===========
    /*
     * 
     * 得到扩展名
     */
    public static String getExtension(String filename, String defExt) { 
        if ((filename != null) && (filename.length() > 0)) { 
            int i = filename.lastIndexOf('.'); 


            if ((i >-1) && (i < (filename.length() - 1))) { 
                return filename.substring(i + 1); 
            } 
        } 
        return defExt; 
    } 
    
    public static void RenameFile(String source){
         boolean  success = (new File(source)).delete(); 
            if(!success){
                System.out.println("文件更改名称失败,源资源文件在使用中!");
            }
            else{
                 String ext=getExtension(source,"");
                 File fDest=new File(source+"."+ext);
                 fDest.renameTo(new File(source)); 
            }


    }
    /*
     * 这里不用转换扩展名和像素大小,直接压缩
     */
    public static void CompressImage(String source,String degree) throws FileNotFoundException, IOException, InterruptedException {
           System.out.println("开始压缩tif");
           FileSeekableStream stream = new FileSeekableStream(source);          
           PlanarImage in = JAI.create("stream", stream);        
           String ext=getExtension(source,"");
           OutputStream os = null;
        
        if ( source.endsWith("tif") || source.endsWith("tiff")){
             os = new FileOutputStream(source+"."+ext);
             TIFFEncodeParam param = new TIFFEncodeParam(); 
              if ("高".endsWith(degree)){
                 param.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE);
             }
             else if ("中".endsWith(degree)){
                 param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP3_1D); 
             }
             else if ("低".endsWith(degree)){
                 param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4); 
             }            
             ImageEncoder enc = ImageCodec.createImageEncoder("TIFF", os, param);             
             try {
                enc.encode(in);                
                os.flush();
                os.close(); 
                stream.close();
            } catch (IOException e) {                
                System.out.println("tiff error"+e.toString());
            }
            RenameFile(source);
        }
        else {
            BufferedImage image = ImageIO.read(new FileInputStream(source));    
            //读取图标    
            BufferedImage image_biao = ImageIO.read(new FileInputStream(    
                source));    
            Graphics2D g = image.createGraphics();    
            g.drawImage(image_biao, 10, 10, image_biao.getWidth(null),    
                        image_biao.getHeight(null), null);    
            g.dispose();    
            FileOutputStream out = new FileOutputStream(source);    
               
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);    
            com.sun.image.codec.jpeg.JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);    
            param.setQuality(0.1f, false);    
            encoder.setJPEGEncodeParam(param);    
            encoder.encode(image);    
            out.close();   
        }
        
    }   
    
    
    //===============JAI 压缩结束======================================= 
    
    public static void tifToJpg(String input2,String output2) throws IOException{
     /* tif转换到jpg格式 */ 
//        String input2 = "d:/img/a.tif"; 
//        String output2 = "d:/img/a.jpg"; 
        RenderedOp src2 = JAI.create("fileload", input2); 
        OutputStream os2 = new FileOutputStream(output2); 
        JPEGEncodeParam param2 = new JPEGEncodeParam(); 
        //指定格式类型,jpg 属于 JPEG 类型 
        ImageEncoder enc2 = ImageCodec.createImageEncoder("JPEG", os2, param2); 
        enc2.encode(src2); 
        os2.close(); 
        
        
//        /*tif转换到bmp格式*/ 
//        String inputFile = "d:/img/b.tif"; 
//        String outputFile = "d:/img/b.bmp"; 
//        RenderedOp src = JAI.create("fileload", inputFile); 
//        OutputStream os = new FileOutputStream(outputFile); 
//        BMPEncodeParam param = new BMPEncodeParam(); 
//        ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os,param); 
//        enc.encode(src); 
//        os.close();//关闭流 
    }
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值