zoukankan      html  css  js  c++  java
  • 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;
        }

    有点忙,先写这了..................后续还有,不只这点资料。

  • 相关阅读:
    Javascript设计模式学习三(策略模式)
    Javascript设计模式学习二(单例)
    HTML5 Canvas 绘图
    Javascript设计模式学习一
    Node.js学习笔记(一)
    C# 多线程
    Solr搜索引擎的搭建与应用
    solr的配置文件及其含义
    SolrNet的基本用法及CURD
    Tomcat安装及配置教程
  • 原文地址:https://www.cnblogs.com/puqiuxiaomao/p/3854046.html
Copyright © 2011-2022 走看看