博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java代码实现图片处理功能。对图片质量进行压缩。
阅读量:5064 次
发布时间:2019-06-12

本文共 6052 字,大约阅读时间需要 20 分钟。

java图片处理有点头疼,找了很多资料。在这里进行一个汇总,记录下个人的体验,也希望对大家有所帮助。

需求:浏览的图片需要在1M一下。

1、真正对图片的质量进行压缩的(不是通过修改图片的高,宽进行缩小图片。就单单缩小图片质量)

  优点:不修改图片大小,简便。

  缺点:对jpg格式能处理很好,对于gif,png其他格式不适合。

compressPic(图片路径,处理格式);
/**         *          * 修改图片大小         * 

描述

* @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; }/** * * 修改单独图片大小 *

描述

* @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+"秒"); } }/** * * 修改多个图片大小 *

描述

* @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,这种需要用到一个包。这种需要设定宽高(我是按照原来比例走的。宽是按照两个A4的宽度走),jar我这里提供出来:

优点:简单,格式支持还行。我测试了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;    }

 

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

转载于:https://www.cnblogs.com/puqiuxiaomao/p/3854046.html

你可能感兴趣的文章
STL——配接器、常用算法使用
查看>>
第9课 uart
查看>>
Range和xrange的区别
查看>>
STL容器之vector
查看>>
无法向会话状态服务器发出会话状态请求
查看>>
数据中心虚拟化技术
查看>>
01入门
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
发送请求时params和data的区别
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
一步步学习微软InfoPath2010和SP2010--第七章节--从SP列表和业务数据连接接收数据(4)--外部项目选取器和业务数据连接...
查看>>
如何增强你的SharePoint 团队网站首页
查看>>
FZU 1914 Funny Positive Sequence(线性算法)
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
基于grunt构建的前端集成开发环境
查看>>
MySQL服务读取参数文件my.cnf的规律研究探索
查看>>