博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java上传并压缩图片(等比例压缩或者原尺寸压缩)
阅读量:6494 次
发布时间:2019-06-24

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

本文转载自

先看效果:

原图:1.33M

 

处理后:27.4kb

 

关键代码;

 

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"); } /** * 根据设置的宽高等比例压缩图片文件
先保存原文件,再压缩、上传 * @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(); } /** * 按设置的宽度高度压缩图片文件
先保存原文件,再压缩、上传 * @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来处理;

你可能感兴趣的文章
沙朗javascript总结一下(一)---基础知识
查看>>
js深入研究之函数内的函数
查看>>
LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard
查看>>
uva-12657 - Boxes in a Line(双向链表)
查看>>
python之commands模块
查看>>
android应用开发--------------看RadioGroup源代码,写相似单选选项卡的集成控件(如底部导航,tab等等)...
查看>>
GCD 和延时调用
查看>>
LeetCode - Binary Tree Level Order Traversal
查看>>
FTP协议完全详解
查看>>
iOS:实现图片的无限轮播
查看>>
【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
查看>>
【环境配置】配置sdk
查看>>
accept()
查看>>
USB 2.0 Hub IP Core
查看>>
USB 2.0 OTG IP Core
查看>>
解读浮动闭合最佳方案:clearfix
查看>>
Charles使用
查看>>
Python GUI编程(Tkinter) windows界面开发
查看>>
linux内核netfilter模块分析之:HOOKs点的注册及调用
查看>>
P(Y|X) 和 P(X,Y)
查看>>