java代碼實現圖片處理功能。對圖片質量進行壓縮。


java圖片處理有點頭疼,找了很多資料。在這里進行一個匯總,記錄下個人的體驗,也希望對大家有所幫助。

需求:瀏覽的圖片需要在1M一下。

1、真正對圖片的質量進行壓縮的(不是通過修改圖片的高,寬進行縮小圖片。就單單縮小圖片質量)

  優點:不修改圖片大小,簡便。

  缺點:對jpg格式能處理很好,對於gif,png其他格式不適合。

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/1c0pekVm

優點:簡單,格式支持還行。我測試了gif,png都可以用、

缺點:寬高需要設定。

  

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;
    }

 

有點忙,先寫這了..................后續還有,不只這點資料。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM