java 压缩图片实例

来源:互联网 发布:分手后做朋友 知乎 编辑:程序博客网 时间:2024/05/22 06:29
</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 blocke.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 blocke.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();//关闭流     }    }


0 0
原创粉丝点击