文档章节

最新图片质量和按大小压缩方法

乡村崽
 乡村崽
发布于 2016/07/19 09:51
字数 1955
阅读 25
收藏 0
/*
 **************************************************************************
 * 版权声明:
 **************************************************************************
 * 程序描述:
 * 图片处理压缩工具
 * 
 **************************************************************************
 * 修改历史:  
 * Date:               by:                Reason:  
 *           
 * 2016年7月18日     Lin.Xu        Initial Version.
 *************************************************************************
 */
package com.bilfinance.util;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;

import org.apache.log4j.Logger;
import org.w3c.dom.Element;

/**
 * Description:<br> 
 * 图片处理压缩工具
 * @author  Lin.Xu
 * @date    2016年7月18日
 * @version v1.0.0
 */
public class ImageCompressionUtil {
    //日志处理对象
    private Logger logger = Logger.getLogger(ImageCompressionUtil.class);
    //初始化压缩比率
    private static float COMPREES_RATIO = 0.38f;

    /**
     * Description:<br> 
     * 按照参数默认压缩比率压缩图片操作
     * @author  Lin.Xu
     * @date    2016年7月18日
     * @version v1.0.0
     * @param originalPath 文件原路径
     * @param thumbnailPath 文件目前路径
     * @param proportion 是否按照设置压缩  false 不压缩  true 按照设置比例压缩
     * @param outWidth  需要压缩的宽度
     * @param outHeight  需要压缩的高度
     * @return
     */
    public boolean compression(String originalPath,String thumbnailPath,
            boolean proportion,int outWidth,int outHeight){
        boolean boolflg = false;
        BufferedImage buffImage = null;  
        FileOutputStream fileOS = null;
        //第一步:获取原始文件信息
        try {
            File origFile = new File(originalPath);
            if(!origFile.exists()){
                logger.info("ImageCompressionUtil处理压缩图片未找到源文件信息");
                boolflg = false;
            }else{
                //第二步:读取图片信息
                BufferedImage bufimg = ImageIO.read(origFile);
                //原始图像的宽度和高度 
                int width = bufimg.getWidth();  
                int height = bufimg.getHeight();
                //调整后的图片的宽度和高度  
                int toWidth = width;  
                int toHeight = height; 
                if(proportion){
                    toWidth = 0 == outWidth ? width : outWidth;
                    toHeight = 0 ==  outHeight ? height : outHeight; 
                }
                //新生成结果图片
                buffImage = new BufferedImage(toWidth, toHeight,BufferedImage.TYPE_INT_RGB);
                buffImage.getGraphics().drawImage(bufimg.getScaledInstance(toWidth, toHeight,Image.SCALE_SMOOTH), 0, 0, null);

                //第三步:写出图片信息
                File outfile = new File(thumbnailPath);
                //如果dir对应的文件不存在,或者不是一个目录,则新建 
                if(!outfile.exists() || !outfile.isDirectory()){    
                    outfile.getParentFile().mkdirs();
                }
                fileOS = new FileOutputStream(outfile);
                //格式化的图片类型
                String formatName = thumbnailPath.substring(thumbnailPath.lastIndexOf(".") + 1);
                ImageWriter imgaewriter = ImageIO.getImageWritersBySuffix(formatName).next();
                ImageOutputStream imageOS = ImageIO.createImageOutputStream(fileOS);
                imgaewriter.setOutput(imageOS);
                //写入压缩的倍数
                JPEGImageWriteParam jpegParams = null;
                if(COMPREES_RATIO >= 0 && COMPREES_RATIO <= 1f){
                    jpegParams  =  (JPEGImageWriteParam) imgaewriter.getDefaultWriteParam();
                    jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
                    jpegParams.setCompressionQuality(COMPREES_RATIO);

                }
                //清除缓存并写出
                imgaewriter.write(null, new IIOImage(buffImage, null, null), jpegParams);
                imageOS.close();
                imgaewriter.dispose();
                boolflg = true;
            }
        } catch (IOException e) {
            logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
            e.printStackTrace();
        }finally{
            try {
                if(null != fileOS){
                    fileOS.flush();
                    fileOS.close();
                }
            } catch (IOException e) {
                logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
                e.printStackTrace();
            }
        }
        return boolflg;
    }

    /**
     * Description:<br> 
     * 按照参数压缩图片操作
     * @author  Lin.Xu
     * @date    2016年7月18日
     * @version v1.0.0
     * @param originalPath 文件原路径
     * @param thumbnailPath 文件目前路径
     * @param proportion 是否按照设置压缩  false 不压缩  true 按照设置比例压缩
     * @param outWidth  需要压缩的宽度
     * @param outHeight  需要压缩的高度
     * @param quality 指定比率压缩图片信息
     * @return
     */
    public boolean compression(String originalPath,String thumbnailPath,
            boolean proportion,int outWidth,int outHeight,float quality){
        boolean boolflg = false;
        BufferedImage buffImage = null;  
        FileOutputStream fileOS = null;
        //第一步:获取原始文件信息
        try {
            File origFile = new File(originalPath);
            if(!origFile.exists()){
                logger.info("ImageCompressionUtil处理压缩图片未找到源文件信息");
                boolflg = false;
            }else{
                //第二步:读取图片信息
                BufferedImage bufimg = ImageIO.read(origFile);
                //原始图像的宽度和高度 
                int width = bufimg.getWidth();  
                int height = bufimg.getHeight();
                //调整后的图片的宽度和高度  
                int toWidth = width;  
                int toHeight = height; 
                if(proportion){
                    toWidth = 0 == outWidth ? width : outWidth;
                    toHeight = 0 ==  outHeight ? height : outHeight; 
                }
                //新生成结果图片
                buffImage = new BufferedImage(toWidth, toHeight,BufferedImage.TYPE_INT_RGB);
                buffImage.getGraphics().drawImage(bufimg.getScaledInstance(toWidth, toHeight,Image.SCALE_SMOOTH), 0, 0, null);

                //第三步:写出图片信息
                File outfile = new File(thumbnailPath);
                //如果dir对应的文件不存在,或者不是一个目录,则新建 
                if(!outfile.exists() || !outfile.isDirectory()){    
                    outfile.getParentFile().mkdirs();
                }
                fileOS = new FileOutputStream(outfile);
                //格式化的图片类型
                String formatName = thumbnailPath.substring(thumbnailPath.lastIndexOf(".") + 1);
                ImageWriter imgaewriter = ImageIO.getImageWritersBySuffix(formatName).next();
                ImageOutputStream imageOS = ImageIO.createImageOutputStream(fileOS);
                imgaewriter.setOutput(imageOS);
                //写入压缩的倍数
                JPEGImageWriteParam jpegParams = null;
                if(quality >= 0 && quality <= 1f){
                    jpegParams  =  (JPEGImageWriteParam) imgaewriter.getDefaultWriteParam();
                    jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
                    jpegParams.setCompressionQuality(quality);
                }
                //清除缓存并写出
                imgaewriter.write(null, new IIOImage(buffImage, null, null), jpegParams);
                imageOS.close();
                imgaewriter.dispose();
                boolflg = true;
            }
        } catch (IOException e) {
            logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
            e.printStackTrace();
        }finally{
            try {
                if(null != fileOS){
                    fileOS.flush();
                    fileOS.close();
                }
            } catch (IOException e) {
                logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
                e.printStackTrace();
            }
        }
        return boolflg;
    }

    /**
     * Description:<br> 
     * 按照固定分辨和压缩比率参数压缩图片操作
     * @author  Lin.Xu
     * @date    2016年7月18日
     * @version v1.0.0
     * @param originalPath 文件原路径
     * @param thumbnailPath 文件目前路径
     * @param proportion 是否按照设置压缩  false 不压缩  true 按照设置比例压缩
     * @param outWidth  需要压缩的宽度
     * @param outHeight  需要压缩的高度
     * @param quality 指定比率压缩图片信息
     * @param dpi 指定比率压缩图片信息
     * @return
     */
    public boolean compression(String originalPath,String thumbnailPath,
            boolean proportion,int outWidth,int outHeight,float quality,Integer dpi){
        boolean boolflg = false;
        BufferedImage buffImage = null;  
        FileOutputStream fileOS = null;
        //第一步:获取原始文件信息
        try {
            File origFile = new File(originalPath);
            if(!origFile.exists()){
                logger.info("ImageCompressionUtil处理压缩图片未找到源文件信息");
                boolflg = false;
            }else{
                //第二步:读取图片信息
                BufferedImage bufimg = ImageIO.read(origFile);
                //原始图像的宽度和高度 
                int width = bufimg.getWidth();  
                int height = bufimg.getHeight();
                //调整后的图片的宽度和高度  
                int toWidth = width;  
                int toHeight = height; 
                if(proportion){
                    toWidth = 0 == outWidth ? width : outWidth;
                    toHeight = 0 ==  outHeight ? height : outHeight; 
                }
                //新生成结果图片
                buffImage = new BufferedImage(toWidth, toHeight,BufferedImage.TYPE_INT_RGB);
                buffImage.getGraphics().drawImage(bufimg.getScaledInstance(toWidth, toHeight,Image.SCALE_SMOOTH), 0, 0, null);

                //第三步:写出图片信息
                File outfile = new File(thumbnailPath);
                //如果dir对应的文件不存在,或者不是一个目录,则新建 
                if(!outfile.exists() || !outfile.isDirectory()){    
                    outfile.getParentFile().mkdirs();
                }
                fileOS = new FileOutputStream(outfile);
                //格式化的图片类型
                String formatName = thumbnailPath.substring(thumbnailPath.lastIndexOf(".") + 1);
                ImageWriter imgaewriter = ImageIO.getImageWritersBySuffix(formatName).next();
                ImageOutputStream imageOS = ImageIO.createImageOutputStream(fileOS);
                imgaewriter.setOutput(imageOS);
                //添加具体的分辨率
                IIOMetadata imageMetaData  =  imgaewriter.getDefaultImageMetadata(new ImageTypeSpecifier(buffImage), null);
                if(dpi !=  null && !dpi.equals("")){
                    Element tree  =  (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
                    Element jfif  =  (Element)tree.getElementsByTagName("app0JFIF").item(0);
                    jfif.setAttribute("Xdensity", Integer.toString(dpi) );
                    jfif.setAttribute("Ydensity", Integer.toString(dpi));

                }
                //写入压缩的倍数
                JPEGImageWriteParam jpegParams = null;
                if(quality >= 0 && quality <= 1f){
                    //新建压缩比率
                    jpegParams  =  (JPEGImageWriteParam) imgaewriter.getDefaultWriteParam();
                    jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
                    jpegParams.setCompressionQuality(quality);

                }
                //清除缓存并写出
                imgaewriter.write(imageMetaData, new IIOImage(buffImage, null, null), jpegParams);
                imageOS.close();
                imgaewriter.dispose();
                boolflg = true;
            }
        } catch (IOException e) {
            logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
            e.printStackTrace();
        }finally{
            try {
                if(null != fileOS){
                    fileOS.flush();
                    fileOS.close();
                }
            } catch (IOException e) {
                logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
                e.printStackTrace();
            }
        }
        return boolflg;
    }

    /**
     * Description:<br> 
     * 按照自定义分辨率参数压缩图片操作
     * @author  Lin.Xu
     * @date    2016年7月18日
     * @version v1.0.0
     * @param originalPath 文件原路径
     * @param thumbnailPath 文件目前路径
     * @param proportion 是否按照设置压缩  false 不压缩  true 按照设置比例压缩
     * @param outWidth  需要压缩的宽度
     * @param outHeight  需要压缩的高度
     * @param dpi 指定分辨率图片信息
     * @return
     */
    public boolean compression(String originalPath,String thumbnailPath,
            boolean proportion,int outWidth,int outHeight,Integer dpi){
        boolean boolflg = false;
        BufferedImage buffImage = null;  
        FileOutputStream fileOS = null;
        //第一步:获取原始文件信息
        try {
            File origFile = new File(originalPath);
            if(!origFile.exists()){
                logger.info("ImageCompressionUtil处理压缩图片未找到源文件信息");
                boolflg = false;
            }else{
                //第二步:读取图片信息
                BufferedImage bufimg = ImageIO.read(origFile);
                //原始图像的宽度和高度 
                int width = bufimg.getWidth();  
                int height = bufimg.getHeight();
                //调整后的图片的宽度和高度  
                int toWidth = width;  
                int toHeight = height; 
                if(proportion){
                    toWidth = 0 == outWidth ? width : outWidth;
                    toHeight = 0 ==  outHeight ? height : outHeight; 
                }
                //新生成结果图片
                buffImage = new BufferedImage(toWidth, toHeight,BufferedImage.TYPE_INT_RGB);
                buffImage.getGraphics().drawImage(bufimg.getScaledInstance(toWidth, toHeight,Image.SCALE_SMOOTH), 0, 0, null);

                //第三步:写出图片信息
                File outfile = new File(thumbnailPath);
                //如果dir对应的文件不存在,或者不是一个目录,则新建 
                if(!outfile.exists() || !outfile.isDirectory()){    
                    outfile.getParentFile().mkdirs();
                }
                fileOS = new FileOutputStream(outfile);
                //格式化的图片类型
                String formatName = thumbnailPath.substring(thumbnailPath.lastIndexOf(".") + 1);
                ImageWriter imgaewriter = ImageIO.getImageWritersBySuffix(formatName).next();
                ImageOutputStream imageOS = ImageIO.createImageOutputStream(fileOS);
                imgaewriter.setOutput(imageOS);
                //添加分辨率
                IIOMetadata imageMetaData  =  imgaewriter.getDefaultImageMetadata(new ImageTypeSpecifier(buffImage), null);
                if(dpi !=  null && !dpi.equals("")){
                    Element tree  =  (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
                    Element jfif  =  (Element)tree.getElementsByTagName("app0JFIF").item(0);
                    jfif.setAttribute("Xdensity", Integer.toString(dpi) );
                    jfif.setAttribute("Ydensity", Integer.toString(dpi));

                }
                //清除缓存并写出
                imgaewriter.write(imageMetaData, new IIOImage(buffImage, null, null), null);
                imageOS.close();
                imgaewriter.dispose();
                boolflg = true;
            }
        } catch (IOException e) {
            logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
            e.printStackTrace();
        }finally{
            try {
                if(null != fileOS){
                    fileOS.flush();
                    fileOS.close();
                }
            } catch (IOException e) {
                logger.info("ImageCompressionUtil处理压缩图片异常:"+e.getMessage());
                e.printStackTrace();
            }
        }
        return boolflg;
    }


    public static void main(String[] args) {
        String inputFoler = "D:\\weiChar\\file\\upload\\attachment\\2016\\07\\18\\2016071800000008_001_A0001.jpg";
        /* 这儿填写你存放要缩小图片的文件夹全地址 */
        String outputFolder = "D:\\weiChar\\file\\upload\\attachment\\2016\\07\\18\\2016071800000008_001_A0001_comprs.jpg";
        /* 这儿填写你转化后的图片存放的文件夹 */
        ImageCompressionUtil imgcomp = new ImageCompressionUtil();
        System.out.println(imgcomp.compression(inputFoler, outputFolder, false, 0,0,0.1f,10));

    }

}

废话不多说,直接上代码,有写的不对地方请多多指教,建议在实际压缩的过程中使用分辨率和压缩比率同时使用,压缩效果更佳,否则单一操作对于有些图片回导致增大。

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 技术迷茫的节点
下一篇: 单点登录 sso
乡村崽
粉丝 5
博文 11
码字总数 13979
作品 0
松江
程序员
私信 提问
短视频从无到有 (九)图片合成视频及图片压缩

图片合成视频 其实,视频的画面就是一帧帧的图片,当帧率大于16也就是一秒钟有16张以上的图片时,人类的视觉就觉得它是连续的。所以,视频画面可以分解成图片,图片也可以合成视频画面。 AV...

卢叁
2018/08/01
0
0
android 比较靠谱的图片压缩

第一:我们先看下质量压缩方法: Java代码 private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFor......

Airship
2015/01/18
0
0
简单5步优化你的网站图片

图像是每个网站的关键组成部分。 根据HTTP Archive,图像占网页上需要加载总数据的比例达60%以上。 几乎成为所有网站上重要的组成部分,无论是电子商务,新闻,时尚网站,博客还是旅游门户网...

oschina
2018/08/09
677
0
说说在 Android 中如何压缩图片

目前存在两种压缩图片方式: 质量压缩 - 不改变图片尺寸。 按比例压缩 - 相当于是在像素上进行压缩。 而图片有三种存在形式: file - 磁盘。 stream - 网络传输、内存。 bitmap - 内存。 bi...

deniro
2018/05/26
0
0
android图片压缩的3种方法实例

android图片压缩的3种方法实例 发布:shangke 字体:[增加 减小] 类型:转载 这篇文章介绍了android图片压缩的3种方法实例,有需要的朋友可以参考一下 android 图片压缩方法:第一:质量压缩...

wanyang
2014/02/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js算法总结

数列求和 等差数列求和 function sum(a0,d,n){//a0->首项,d->公差,n->项数//(首项+末项)*项数/2return (a1+(a1+d*n))*n/2;} 等比数列求和 function sum(a0,q,n){//a0->首项,q->公......

祖达
35分钟前
1
0
小白?转型?毕业生?外行学习快速入行大数据开发指南

这篇文章中,本文将针对三种不同的、想要进入数据科学领域的人群,给出自己的经验,帮助他们迅速有效入行。 虽然没有适合每个人的万能解决方案,但这三类建议值得想转行的你一看。 第1类:新...

董黎明
43分钟前
1
0
好文 | MySQL 索引B+树原理,以及建索引的几大原则

MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 ...

Java爬坑之路
46分钟前
1
0
mysql group by 和 Order By 执行顺序

1.在写统计的时候,我们会用到统计首单,这样里面设计到排序。写子查询的方式当然可以实现, 但是我们有时候,需要创建视图,视图不支持带子查询的。 加了排序后会返回,排序后的哪个第一条数...

kuchawyz
50分钟前
2
0
Spring Boot 2.X 如何添加拦截器?

最近使用SpringBoot2.X搭建了一个项目,大部分接口都需要做登录校验,所以打算使用注解+拦截器来实现,在此记录下实现过程。 一、实现原理 1. 自定义一个注解@NeedLogin,如果接口需要进行登...

花漾年华
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部