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
- java 压缩图片 实例
- java 压缩图片实例
- 压缩图片实例
- Java 图片压缩
- java图片压缩
- java图片压缩
- java图片压缩、解压缩
- JAVA 图片压缩
- java 图片压缩
- java 剪切 压缩 图片
- Java图片压缩处理
- java--图片水印、压缩
- Java 压缩图片
- java 图片压缩 缩放
- Java 压缩图片
- java图片压缩
- java处理压缩图片
- java图片压缩
- TOJ Monkey Vines
- vdfvfdvfv
- UCF 大牛 Prof. Shah 课题组代码合集
- TOJ 1563 Round and Round We Go (弃9数)
- java中变量、对象的存储位置
- java 压缩图片实例
- 数据结构 栈
- STL源码剖析 容器 stl_tree.h
- [NWPU][2014][TRN][6]动态规划第一讲——简单线性dp_C题
- 封装 Encapsulation
- 【python】爬虫3——抓取亦舒博客所有文章
- 从卷积到SIFT到multi-scale volume
- 九度oj的入门做法
- Linux lsof命令