java圖片處理有點頭疼,找了不少資料。在這裏進行一個彙總,記錄下我的的體驗,也但願對你們有所幫助。java
需求:瀏覽的圖片須要在1M一下。數組
一、真正對圖片的質量進行壓縮的(不是經過修改圖片的高,寬進行縮小圖片。就單單縮小圖片質量)測試
優勢:不修改圖片大小,簡便。spa
缺點:對jpg格式能處理很好,對於gif,png其餘格式不適合。code
compressPic(圖片路徑,處理格式);
/** * * 修改圖片大小 * <p>描述</p> * @date 2014-7-10 下午4:27:51 * @version * @param srcFilePath * @param fileExtName * @return * @throws IOException */ public static boolean compressPic(String srcFilePath,String fileExtName) throws IOException { File file = null; BufferedImage src = null; FileOutputStream out = null; ImageWriter imgWrier; ImageWriteParam imgWriteParams; long start1 = System.currentTimeMillis(); // 指定寫圖片的方式爲 jpg imgWrier = ImageIO.getImageWritersByFormatName(fileExtName).next(); imgWriteParams = imgWrier.getDefaultWriteParam(); // imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam( // null); // imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam( // null); imgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 這裏指定壓縮的程度,參數qality是取值0~1範圍內, imgWriteParams.setCompressionQuality((float) 0.2); //imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);// ColorModel colorModel =ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault(); // 指定壓縮時使用的色彩模式 imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier( colorModel, colorModel.createCompatibleSampleModel(16, 16))); long end1 = System.currentTimeMillis(); System.out.println("11111消耗時間:"+((double)end1-(double)start1)/1000+"秒"); try { if (isBlank(srcFilePath)) { return false; } else { file = new File(srcFilePath); src = ImageIO.read(file); out = new FileOutputStream(srcFilePath); System.out.println("22222"); imgWrier.reset(); // 必須先指定 out值,才能調用write方法, ImageOutputStream能夠經過任何 // OutputStream構造 imgWrier.setOutput(ImageIO.createImageOutputStream(out)); System.out.println("3333333"); // 調用write方法,就能夠向輸入流寫圖片 long start4 = System.currentTimeMillis(); imgWrier.write(null, new IIOImage(src, null, null), imgWriteParams); long end4 = System.currentTimeMillis(); System.out.println("4444消耗時間:"+((double)end4-(double)start4)/1000+"秒"); src.flush(); out.flush(); out.close(); imgWrier.dispose(); } } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * * 修改單獨圖片大小 * <p>描述</p> * @date 2014-7-10 下午4:26:30 * @version * @param filePath * @param createType * @throws Exception */ public static void changeNoneImgSize(String filePath,String createType) throws Exception { File tempFile = new File(filePath); if(tempFile.length()>ImagesUtils.IMAGEMAXSIZE){ long start = System.currentTimeMillis(); compressPic(filePath,createType); long end = System.currentTimeMillis(); System.out.println(filePath+"消耗時間:"+((double)end-(double)start)/1000+"秒"); } } /** * * 修改多個圖片大小 * <p>描述</p> * @date 2014-7-10 下午4:26:52 * @version * @param file * @throws Exception */ public static void changeManyImgSize(File file) throws Exception { try { // 判斷文件是不是文件,若是是文件,獲取路徑,並計數 if (file.isFile()) { String fileExtName = file.getName().substring( (file.getName().lastIndexOf(".") + 1), file.getName().length()); if(ImagesUtils.isImageFile(fileExtName)) changeNoneImgSize(file.getAbsolutePath(), fileExtName); //ImagesUtils.changeImgSize(file.getAbsolutePath(), ImagesUtils.CREATENEWIMAGETYPE_6); } else { // 若是是文件夾,聲明一個數組放文件夾和他的子文件 File[] f = file.listFiles(); // 遍歷文件件下的文件,並獲取路徑 for (File file2 : f) { changeManyImgSize(file2); } } } catch (RuntimeException e) { e.printStackTrace(); } }
2,這種須要用到一個java-image-scaling-0.8.5.jar包。這種須要設定寬高(我是按照原來比例走的。寬是按照兩個A4的寬度走),jar我這裏提供出來:http://pan.baidu.com/s/1c0pekVmorm
優勢:簡單,格式支持還行。我測試了gif,png均可以用、blog
缺點:寬高須要設定。圖片
public static boolean compressPic(String srcFilePath,String fileExtName) throws IOException { try { BufferedImage sourceImage = ImageIO.read(new File(srcFilePath)); int newwidth = 1700; double newheight = ((double) sourceImage.getHeight() / (double) sourceImage.getWidth()) * 1700; ResampleOp resizeOp = new ResampleOp(newwidth, (int) newheight); resizeOp.setFilter(ResampleFilters.getTriangleFilter()); BufferedImage resizedImage = resizeOp.filter(sourceImage, null); ImageIO.write(resizedImage, "jpg", new File(srcFilePath)); } catch (Exception e) { log.error("compressPic error", e); return false; } return true; }
有點忙,先寫這了..................後續還有,不僅這點資料。ci