本文实例讲述了Java实现的上传并压缩图片功能。分享给大家供大家参考,具体如下:

先看效果:

原图:1.33M

处理后:27.4kb

关键代码:

  1. package codeGenerate.util;
  2. import java.awt.Color;
  3. import java.awt.Graphics2D;
  4. import java.awt.Image;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.FileNotFoundException;
  8. import java.io.IOException;
  9. import javax.imageio.ImageIO;
  10. public class ImageZipUtil {
  11. public static void main(String[] args) {
  12. zipWidthHeightImageFile(new File("C:\\spider\\3.png"),new File("C:\\spider\\3-1.jpg"),425,638,0.7f);
  13. //zipImageFile(new File("C:\\spider\\2.JPG"),new File("C:\\spider\\2-2.JPG"),425,638,0.7f);
  14. //zipImageFile(new File("C:\\spider\\3.jpg"),new File("C:\\spider\\3-3.jpg"),425,638,0.7f);
  15. System.out.println("ok");
  16. }
  17. /**
  18. * 根据设置的宽高等比例压缩图片文件<br> 先保存原文件,再压缩、上传
  19. * @param oldFile 要进行压缩的文件
  20. * @param newFile 新文件
  21. * @param width 宽度 //设置宽度时(高度传入0,等比例缩放)
  22. * @param height 高度 //设置高度时(宽度传入0,等比例缩放)
  23. * @param quality 质量
  24. * @return 返回压缩后的文件的全路径
  25. */
  26. public static String zipImageFile(File oldFile,File newFile, int width, int height,float quality) {
  27. if (oldFile == null) {
  28. return null;
  29. }
  30. try {
  31. /** 对服务器上的临时文件进行处理 */
  32. Image srcFile = ImageIO.read(oldFile);
  33. int w = srcFile.getWidth(null);
  34. int h = srcFile.getHeight(null);
  35. double bili;
  36. if(width>0){
  37. bili=width/(double)w;
  38. height = (int) (h*bili);
  39. }else{
  40. if(height>0){
  41. bili=height/(double)h;
  42. width = (int) (w*bili);
  43. }
  44. }
  45. String srcImgPath = newFile.getAbsoluteFile().toString();
  46. System.out.println(srcImgPath);
  47. String subfix = "jpg";
  48. subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
  49. BufferedImage buffImg = null;
  50. if(subfix.equals("png")){
  51. buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  52. }else{
  53. buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  54. }
  55. Graphics2D graphics = buffImg.createGraphics();
  56. graphics.setBackground(new Color(255,255,255));
  57. graphics.setColor(new Color(255,255,255));
  58. graphics.fillRect(0, 0, width, height);
  59. graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
  60. ImageIO.write(buffImg, subfix, new File(srcImgPath));
  61. } catch (FileNotFoundException e) {
  62. e.printStackTrace();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. return newFile.getAbsolutePath();
  67. }
  68. /**
  69. * 按设置的宽度高度压缩图片文件<br> 先保存原文件,再压缩、上传
  70. * @param oldFile 要进行压缩的文件全路径
  71. * @param newFile 新文件
  72. * @param width 宽度
  73. * @param height 高度
  74. * @param quality 质量
  75. * @return 返回压缩后的文件的全路径
  76. */
  77. public static String zipWidthHeightImageFile(File oldFile,File newFile, int width, int height,float quality) {
  78. if (oldFile == null) {
  79. return null;
  80. }
  81. String newImage = null;
  82. try {
  83. /** 对服务器上的临时文件进行处理 */
  84. Image srcFile = ImageIO.read(oldFile);
  85. String srcImgPath = newFile.getAbsoluteFile().toString();
  86. System.out.println(srcImgPath);
  87. String subfix = "jpg";
  88. subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
  89. BufferedImage buffImg = null;
  90. if(subfix.equals("png")){
  91. buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  92. }else{
  93. buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  94. }
  95. Graphics2D graphics = buffImg.createGraphics();
  96. graphics.setBackground(new Color(255,255,255));
  97. graphics.setColor(new Color(255,255,255));
  98. graphics.fillRect(0, 0, width, height);
  99. graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
  100. ImageIO.write(buffImg, subfix, new File(srcImgPath));
  101. } catch (FileNotFoundException e) {
  102. e.printStackTrace();
  103. } catch (IOException e) {
  104. e.printStackTrace();
  105. }
  106. return newImage;
  107. }
  108. }

说明:

1、根据需求大家可以自行设置质量参数quality,到底设置成多少,可以先看下效果在取值;

2、网上通用的方法用的是jdk自带jar包中方法,我这里衍生了一下:用Graphics2D,能够同时处理jpg和png格式;

3、new Color(255,255,255)是白色,等同于WHITE,但是用WHITE 的话,Linux下某些图片会有其它色值;

4、main中的宽425和高638可以根据自己的需求自行设置,但是对于长和宽一样的,按照400(小值的值425)*400来处理;

原文链接:https://blog.csdn.net/xb12369/article/details/51121504

Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】的更多相关文章

  1. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

    以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...

  2. 前端的图片压缩image-compressor(可在图片上传前实现图片压缩)

    https://www.imooc.com/article/40038 https://www.jianshu.com/p/3ce3e3865ae2 前端的图片压缩image-compressor(可 ...

  3. 异步上传&预览图片-不压缩图片

    本例使用ajaxFileUpload异步上传预览图片 <bean id="multipartResolver" class="org.springframework ...

  4. java大文件上传解决方案

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  5. Java Web文件上传

    参考资料:http://www.cnblogs.com/xdp-gacl/p/4200090.html 一.问题描述 Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个 ...

  6. java中的上传下载----ajaxFileUpload+struts2

    文件上传在项目中应该是非常常见的,而且很多时候,上传文件都只是一个小页面中的一个功能,要求在实现文件上传的前提下不刷新页面.而一般情况下将客户端的文件包装成网络地址传递到服务器端然后通过流来进行文件传 ...

  7. 前端上传 base64 编码图片到七牛云存储

    参考文档 如何上传base64编码图片到七牛云 调试过程 文档中分别有 java 和 html 的 demo,可以根据文档示例调试. 下面是我调试的过程,可以作为参考,特别注意的是,如果需要给文件起名 ...

  8. Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)

    相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/artic ...

  9. Java Web文件上传原理分析(不借助开源fileupload上传jar包)

    Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web   最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...

随机推荐

  1. typescript 点滴

    1 extend的用法 const x = extend({ a: 'hello' }, { b: 42 }); 2只有在d.ts,你才可以使用  export as 这样子的语法.而且必须有name ...

  2. 修改centos7容器的时间和宿主机时间一致

    一.问题 centos7系统容器时间与宿主机系统时间不一致,就进去查看一番,发现时区和宿主机上的时间不一致,下面就来解决一下 二.现象 1.查看centos宿主机的时间 输入如下命令查看 # date ...

  3. 部署LAMP环境搭建一个网站论坛平台

    修改主机名 Hostname openstack-001 Hostname Login 修改本地域名解析 Vi /etc/hosts 最后一行添加 192.168.1.56 openstack-001 ...

  4. Python3标准库:copy复制对象

    1. copy复制对象 copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象. 1.1 浅副本 copy()创建的浅副本(shallow copy)是一个新容器,其中填充了原 ...

  5. 剑指offer-面试题66-构建乘积数组-发散思维

    /* 题目: 链接:https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46 来源:牛客网 给定一个数组A[ ...

  6. Android开发之adt bundle安装

    这个学期开了一门手机游戏开发的课,所以就接触到了adt bundle,Android开发环境有三种方式,分别是JDK+SDK+Eclipse+ADT.JDK+adt-bundle与JDK+Androi ...

  7. 【ffmpeg 视频下载】使用cmd视频下载

    概述 ffmpeg是什么? FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.并且,很多视频播放器都是采用他的内核. 安装与使用 安装ffmpeg ffmpeg下载 ...

  8. spring mvc5 的 配置文件 pom.xml

    spring mvc5 的 配置文件  pom.xml <?xml version="1.0" encoding="UTF-8"?> <pro ...

  9. Mac视频下载转换器MovieSherlock使用教程

    MovieSherlock for Mac是什么软件?moviesherlock for Mac是运行在Mac平台上一款专业的视频下载转换工具,能快速的下载和转换YouTube电影,并保持原视频的质量 ...

  10. gcc 将两个文件合成一个文件(c)

    一个文件是: 一个文件是: 两个文件的作用是输出一段文字,其中一个文件调用了另一个文件 gcc 命令为: -c 生成了object 文件,-o 生成了可执行文件,并且合成.