Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】
本文实例讲述了Java实现的上传并压缩图片功能。分享给大家供大家参考,具体如下:
先看效果:
原图:1.33M
处理后:27.4kb
关键代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | package codeGenerate.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import javax.imageio.ImageIO; public class ImageZipUtil { public static void main(String[] args) { zipWidthHeightImageFile( new File( "C:\\spider\\3.png" ), new File( "C:\\spider\\3-1.jpg" ), 425 , 638 , 0 .7f); //zipImageFile(new File("C:\\spider\\2.JPG"),new File("C:\\spider\\2-2.JPG"),425,638,0.7f); //zipImageFile(new File("C:\\spider\\3.jpg"),new File("C:\\spider\\3-3.jpg"),425,638,0.7f); System.out.println( "ok" ); } /** * 根据设置的宽高等比例压缩图片文件<br> 先保存原文件,再压缩、上传 * @param oldFile 要进行压缩的文件 * @param newFile 新文件 * @param width 宽度 //设置宽度时(高度传入0,等比例缩放) * @param height 高度 //设置高度时(宽度传入0,等比例缩放) * @param quality 质量 * @return 返回压缩后的文件的全路径 */ public static String zipImageFile(File oldFile,File newFile, int width, int height, float quality) { if (oldFile == null ) { return null ; } try { /** 对服务器上的临时文件进行处理 */ Image srcFile = ImageIO.read(oldFile); int w = srcFile.getWidth( null ); int h = srcFile.getHeight( null ); double bili; if (width> 0 ){ bili=width/( double )w; height = ( int ) (h*bili); } else { if (height> 0 ){ bili=height/( double )h; width = ( int ) (w*bili); } } String srcImgPath = newFile.getAbsoluteFile().toString(); System.out.println(srcImgPath); String subfix = "jpg" ; subfix = srcImgPath.substring(srcImgPath.lastIndexOf( "." )+ 1 ,srcImgPath.length()); BufferedImage buffImg = null ; if (subfix.equals( "png" )){ buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); } else { buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } Graphics2D graphics = buffImg.createGraphics(); graphics.setBackground( new Color( 255 , 255 , 255 )); graphics.setColor( new Color( 255 , 255 , 255 )); graphics.fillRect( 0 , 0 , width, height); graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0 , 0 , null ); ImageIO.write(buffImg, subfix, new File(srcImgPath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return newFile.getAbsolutePath(); } /** * 按设置的宽度高度压缩图片文件<br> 先保存原文件,再压缩、上传 * @param oldFile 要进行压缩的文件全路径 * @param newFile 新文件 * @param width 宽度 * @param height 高度 * @param quality 质量 * @return 返回压缩后的文件的全路径 */ public static String zipWidthHeightImageFile(File oldFile,File newFile, int width, int height, float quality) { if (oldFile == null ) { return null ; } String newImage = null ; try { /** 对服务器上的临时文件进行处理 */ Image srcFile = ImageIO.read(oldFile); String srcImgPath = newFile.getAbsoluteFile().toString(); System.out.println(srcImgPath); String subfix = "jpg" ; subfix = srcImgPath.substring(srcImgPath.lastIndexOf( "." )+ 1 ,srcImgPath.length()); BufferedImage buffImg = null ; if (subfix.equals( "png" )){ buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); } else { buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } Graphics2D graphics = buffImg.createGraphics(); graphics.setBackground( new Color( 255 , 255 , 255 )); graphics.setColor( new Color( 255 , 255 , 255 )); graphics.fillRect( 0 , 0 , width, height); graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0 , 0 , null ); ImageIO.write(buffImg, subfix, new File(srcImgPath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return newImage; } } |
说明:
1、根据需求大家可以自行设置质量参数quality,到底设置成多少,可以先看下效果在取值;
2、网上通用的方法用的是jdk自带jar包中方法,我这里衍生了一下:用Graphics2D
,能够同时处理jpg和png格式;
3、new Color(255,255,255)
是白色,等同于WHITE,但是用WHITE 的话,Linux下某些图片会有其它色值;
4、main中的宽425和高638可以根据自己的需求自行设置,但是对于长和宽一样的,按照400(小值的值425)*400来处理;
更多java相关内容感兴趣的读者可查看本站专题:《Java图片操作技巧汇总》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》及《Java数据结构与算法教程》。
希望本文所述对大家java程序设计有所帮助。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
如何使用IntelliJ IDEA的HTTP Client进行接口验证
这篇文章主要介绍了如何使用IntelliJ IDEA的HTTP Client进行接口验证,本文给大家分享最新完美解决方案,感兴趣的朋友跟随小编一起看看吧2024-06-06详解SpringCloud Finchley Gateway 统一异常处理
这篇文章主要介绍了详解SpringCloud Finchley Gateway 统一异常处理,非常具有实用价值,需要的朋友可以参考下2018-10-10
最新评论