import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; * like12 find bug,20230419 * 注意:此sun工具类有bug:处理大图片如20MB时会疯狂占用内存 可能导致内存溢出,无限制时可占用高达数G的内存 * 启动后内存疯狂飙升至2G多才处理成功 1024M直接死掉起不来 正常运行内容占用应为900MB左右 * like12 modified,20230419,优化 合并一次多余的读文件操作 减少一次多余的缩放操作 绘图时直接缩放 * 解决大图片如20M时 疯狂占用内存数G的问题 public class CompressImgUtil extends HttpServlet { private static final long serialVersionUID = 1L; * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩 * like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真) * @param imgsrc 源图片地址 * @param out 目标图片地址 * @param widthdist 压缩后图片宽度(当rate==null时,必传) * @param heightdist 压缩后图片高度(当rate==null时,必传) * @param rate 压缩比例 public static void compressImg(String imgsrc, ByteArrayOutputStream out, int widthdist, int heightdist, Float rate) { try { // 1.打开并读取文件 File srcfile = new File(imgsrc); if (!srcfile.exists()) {// 检查文件是否存在 return; // 读取文件 Image src = ImageIO.read(srcfile);// 这一步对大图片来说如20M 非常耗内存约1G // 2.计算压缩后的宽高 // like12 modified,20230419,优化 合并读文件 只读一次,解决2次读白耗内存的问题 int wideth = src.getWidth(null); // 得到源图宽 int height = src.getHeight(null); // 得到源图长 if (wideth == 0 || height == 0 || wideth == -1 || height == -1) { return; // 如果rate不为空说明是按比例压缩 if (rate != null && rate > 0) { widthdist = (int) (wideth * rate); heightdist = (int) (height * rate); //like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真) else if(rate == null && widthdist > 0 && heightdist == 0){ rate = (float)(widthdist * 1.0 / wideth); heightdist = (int) (height * rate); }else if(rate == null && widthdist == 0 && heightdist > 0){ rate = (float)(heightdist * 1.0 / height); widthdist = (int) (wideth * rate); // 3.开启压缩 // 准备buff BufferedImage bufferedImage = new BufferedImage(widthdist, heightdist, BufferedImage.TYPE_INT_RGB); // 开始压缩 //like12 find bug,20230419,多执行了一次缩放操作,大图片时如20M 多耗费内存数百M //bufferedImage.getGraphics().drawImage( // src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH),// 这是缩放操作 // 0, 0, null); //like12 modified,20230419,优化 绘图时直接缩放 bufferedImage.getGraphics().drawImage(src, 0, 0, widthdist, heightdist, null); // 4.写文件 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(bufferedImage); } catch (IOException ex) { ex.printStackTrace(); * like12 modified,20230419,优化 合并一次多余的读文件操作 减少一次多余的缩放操作 绘图时直接缩放 * 解决大图片如20M时 疯狂占用内存数G的问题 * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩 * like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真) * @param imgsrc 源图片地址 * @param imgdist 目标图片地址 * @param widthdist 压缩后图片宽度(当rate==null时,必传) * @param heightdist 压缩后图片高度(当rate==null时,必传) * @param rate 压缩比例 public static void compressImg(String imgsrc, String imgdist, int widthdist, int heightdist, Float rate) { try { // 1.打开并读取文件 File srcfile = new File(imgsrc); if (!srcfile.exists()) {// 检查文件是否存在 return; // 读取文件 Image src = ImageIO.read(srcfile);// 这一步对大图片来说如20M 非常耗内存约1G // 2.计算压缩后的宽高 // like12 modified,20230419,优化 合并读文件 只读一次,解决2次读白耗内存的问题 int wideth = src.getWidth(null); // 得到源图宽 int height = src.getHeight(null); // 得到源图长 if (wideth == 0 || height == 0 || wideth == -1 || height == -1) { return; // 如果rate不为空说明是按比例压缩 if (rate != null && rate > 0) { widthdist = (int) (wideth * rate); heightdist = (int) (height * rate); //like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真) else if(rate == null && widthdist > 0 && heightdist == 0){ rate = (float)(widthdist * 1.0 / wideth); heightdist = (int) (height * rate); }else if(rate == null && widthdist == 0 && heightdist > 0){ rate = (float)(heightdist * 1.0 / height); widthdist = (int) (wideth * rate); // 3.开启压缩 // 准备buff BufferedImage bufferedImage = new BufferedImage(widthdist, heightdist, BufferedImage.TYPE_INT_RGB); // 开始压缩 //like12 find bug,20230419,多执行了一次缩放操作,大图片时如20M 多耗费内存数百M //bufferedImage.getGraphics().drawImage( // src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH),// 这是缩放操作 // 0, 0, null); //like12 modified,20230419,优化 绘图时直接缩放 bufferedImage.getGraphics().drawImage(src, 0, 0, widthdist, heightdist, null); // 4.写文件 FileOutputStream out = new FileOutputStream(imgdist); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(bufferedImage); out.close(); } catch (IOException ex) { ex.printStackTrace(); * 未用的方法(Toolkit) 前面的方法优化后占用内存比本方法还小些 * @param imgsrc * @param imgdist * @param widthdist * @param heightdist * @param rate private static void compressImgToolkit(String imgsrc, String imgdist, int widthdist, int heightdist, Float rate) { try { // 1.打开文件 File srcfile = new File(imgsrc); // 检查文件是否存在 if (!srcfile.exists()) { return; // 2.使用Toolkit.getImage异步读取源图片 并得到源图片宽高 Toolkit toolkit = Toolkit.getDefaultToolkit(); Image srcImage = toolkit.getImage(srcfile.getAbsolutePath()); // 构造Image对象 int wideth = -1; int height = -1; boolean flag = true; while (flag) { wideth = srcImage.getWidth(null); // 得到源图宽 height = srcImage.getHeight(null); // 得到源图长 System.out.println("wideth:" + wideth + " height:" + height); if (wideth > 0 && height > 0) { // 因为 Toolkit.getImage 是异步读取,如果wideth 和 height 都大于0,表明图片已经加载完毕 // imageCanvas.setImage(srcImage); flag = false; } else { try { Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); // 3.计算压缩后的宽高 if (wideth == 0 || height == 0 || wideth == -1 || height == -1) { return; // 如果rate不为空说明是按比例压缩 if (rate != null && rate > 0) { widthdist = (int) (wideth * rate); heightdist = (int) (height * rate); //like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真) else if(rate == null && widthdist > 0 && heightdist == 0){ rate = (float)(widthdist * 1.0 / wideth); heightdist = (int) (height * rate); else if(rate == null && widthdist == 0 && heightdist > 0){ rate = (float)(heightdist * 1.0 / height); widthdist = (int) (wideth * rate); System.out.println(imgsrc + " " + imgdist + " -- " + widthdist + " " + heightdist); // 准备buff BufferedImage bufferedImage = new BufferedImage(widthdist, heightdist, BufferedImage.TYPE_INT_RGB); // 开始压缩 boolean flag2 = false; while (!(flag2 = bufferedImage.getGraphics().drawImage(srcImage, 0, 0, widthdist, heightdist, null))) {// 绘制缩小后的图 try { Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); try { // 写文件 File outputFile = new File(imgdist); if (!outputFile.exists()) { outputFile.createNewFile(); FileOutputStream out = new FileOutputStream(outputFile); // 输出到文件流 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(bufferedImage); // 近JPEG编码 out.close(); } catch (Exception e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); * 已停用(减少一次读操作 解决大图片如20M时 疯狂占用内存的问题) * like12 find bug,大图片如20M时有bug,读取图片非常耗内存20M约耗用1G左右 * 需优化,应取消这里的读文件,减少一次读操作即可减少一半的内存消耗,此大对象是直接进入老年代,且长久不会回收 * 获取图片宽度 * @param file 图片文件 * @return 宽度 /*public static int[] getImgWidth(File file) { InputStream is = null; BufferedImage src = null; int result[] = { 0, 0 }; try { is = new FileInputStream(file); src = ImageIO.read(is);// 这一步对大图片来说如20M 非常耗内存约1G result[0] = src.getWidth(null); // 得到源图宽 result[1] = src.getHeight(null); // 得到源图高 is.close(); } catch (Exception e) { e.printStackTrace(); return result; * 获取图片大小 及 尺寸(测试) * @param filePath * @return * @throws FileNotFoundException * @throws IOException public static Float getImgWidthTest(String filePath) throws FileNotFoundException, IOException { //图片大小(文件大小) File picture = new File(filePath); Float size = Float.parseFloat(String.format("%.1f", picture.length() / 1024.0 / 1024.0)); System.out.println("图片大小:" + size + "MB"); //图片尺寸 BufferedImage sourceImg = ImageIO.read(new FileInputStream(picture)); System.out.println("宽:" + sourceImg.getWidth()); System.out.println("高:" + sourceImg.getHeight()); return size; public static void main(String[] args) throws FileNotFoundException, IOException { System.out.println("图片压缩测试..."); /*//获取图片大小 CompressImgUtil.getImgWidthTest("D:/test.jpg");*/ //图片压缩 String srcFile = "D://test.jpg"; String destFile = "D://tempCompressImg.jpg"; //String destFile = "D://test.jpg";//相同路径可以覆盖 File srcfile = new File(srcFile); System.out.println("压缩前srcfile size:" + srcfile.length()); //压缩(相同路径可以覆盖) //CompressImgUtil.compressImg(srcFile, destFile, 600, 800, null); //CompressImgUtil.compressImg(srcFile, destFile, 110, 130, null); //CompressImgUtil.compressImg(srcFile, destFile, 110, 0, null); //CompressImgUtil.compressImg(srcFile, destFile, 0, 130, null); CompressImgUtil.compressImg(srcFile, destFile, 0, 0, Float.parseFloat("0.5")); //未用的方法(Toolkit) 前面的方法优化后占用内存比本方法还小些 //CompressImgUtil.compressImgToolkit(srcFile, destFile, 0, 0, Float.parseFloat("0.5")); File distfile = new File(destFile); System.out.println("压缩后distfile size:" + distfile.length()); System.out.println("Finish!"); /*//调试时不退出 while (true){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace();

Java获取图片大小 及 尺寸 (已停用 大图片时需优化 大图片如20M时 会疯狂占用内存至数G)

* 获取图片大小 及 尺寸(测试) * @param filePath * @return * @throws FileNotFoundException * @throws IOException public static Float getImgWidthTest(String filePath) throws FileNotFoundException, IOException { //图片大小(文件大小) File picture = new File(filePath); Float size = Float.parseFloat(String.format("%.1f", picture.length() / 1024.0 / 1024.0)); System.out.println("图片大小:" + size + "MB"); //图片尺寸 BufferedImage sourceImg = ImageIO.read(new FileInputStream(picture)); System.out.println("宽:" + sourceImg.getWidth()); System.out.println("高:" + sourceImg.getHeight()); return size;

(已停用 大图片时需优化 大图片如20M时 会疯狂占用内存至数G)

图片压缩-新2022(解决打包时报错“程序包com.sun.image.codec.jpeg不存在”的问题)

package com.qyj.utils;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
//import com.sun.image.codec.jpeg.JPEGCodec;
//import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class CompressImgUtil extends HttpServlet {
	private static final long serialVersionUID = 1L;
	 * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩
	 * like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
	 * @param imgsrc 源图片地址
	 * @param out 目标图片地址
	 * @param widthdist 压缩后图片宽度(当rate==null时,必传)
	 * @param heightdist 压缩后图片高度(当rate==null时,必传)
	 * @param rate 压缩比例
	public static void compressImg(String imgsrc, ByteArrayOutputStream out, int widthdist,
								   int heightdist, Float rate) {
		try {
			File srcfile = new File(imgsrc);
			// 检查文件是否存在
			if (!srcfile.exists()) {
				return;
			// 如果rate不为空说明是按比例压缩
			if (rate != null && rate > 0) {
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					widthdist = (int) (results[0] * rate);
					heightdist = (int) (results[1] * rate);
			//like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
			else if(rate == null && widthdist > 0 && heightdist == 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(widthdist * 1.0 / results[0]);
					heightdist = (int) (results[1] * rate);
			else if(rate == null && widthdist == 0 && heightdist > 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(heightdist * 1.0 / results[1]);
					widthdist = (int) (results[0] * rate);
			// 开始读取文件并进行压缩
			Image src = ImageIO.read(srcfile);
			BufferedImage tag = new BufferedImage((int) widthdist,
					(int) heightdist, BufferedImage.TYPE_INT_RGB);
			tag.getGraphics().drawImage(
					src.getScaledInstance(widthdist, heightdist,
							Image.SCALE_SMOOTH), 0, 0, null);
			//like12 modified,20221113,解决打包时报错“程序包com.sun.image.codec.jpeg不存在”的问题
			/*//过时的实现类JPEGImageEncoder,是sun公司的私有实现
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(tag);*/
			//使用统一的ImageIO进行图像格式文件的读写
			String formatName = imgsrc.substring(imgsrc.lastIndexOf(".") + 1);
			ImageIO.write(tag, formatName, out);
		} catch (IOException ex) {
			ex.printStackTrace();
	 * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩
	 * like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
	 * @param imgsrc 源图片地址
	 * @param imgdist 目标图片地址
	 * @param widthdist 压缩后图片宽度(当rate==null时,必传)
	 * @param heightdist 压缩后图片高度(当rate==null时,必传)
	 * @param rate 压缩比例
	public static void compressImg(String imgsrc, String imgdist, int widthdist,
			int heightdist, Float rate) {
		try {
			File srcfile = new File(imgsrc);
			// 检查文件是否存在
			if (!srcfile.exists()) {
				return;
			// 如果rate不为空说明是按比例压缩
			if (rate != null && rate > 0) {
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					widthdist = (int) (results[0] * rate);
					heightdist = (int) (results[1] * rate);
			//like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
			else if(rate == null && widthdist > 0 && heightdist == 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(widthdist * 1.0 / results[0]);
					heightdist = (int) (results[1] * rate);
			else if(rate == null && widthdist == 0 && heightdist > 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(heightdist * 1.0 / results[1]);
					widthdist = (int) (results[0] * rate);
			// 开始读取文件并进行压缩
			Image src = ImageIO.read(srcfile);
			BufferedImage tag = new BufferedImage((int) widthdist,
					(int) heightdist, BufferedImage.TYPE_INT_RGB);
			tag.getGraphics().drawImage(
					src.getScaledInstance(widthdist, heightdist,
							Image.SCALE_SMOOTH), 0, 0, null);
			//like12 modified,20221113,解决打包时报错“程序包com.sun.image.codec.jpeg不存在”的问题
			/*//过时的实现类JPEGImageEncoder,是sun公司的私有实现
			FileOutputStream out = new FileOutputStream(imgdist);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(tag);
			out.close();*/
			//使用统一的ImageIO进行图像格式文件的读写
			String formatName = imgdist.substring(imgdist.lastIndexOf(".") + 1);
			ImageIO.write(tag, formatName, new File(imgdist));
		} catch (IOException ex) {
			ex.printStackTrace();
	 * 获取图片宽度
	 * @param file
	 *            图片文件
	 * @return 宽度
	public static int[] getImgWidth(File file) {
		InputStream is = null;
		BufferedImage src = null;
		int result[] = { 0, 0 };
		try {
			is = new FileInputStream(file);
			src = ImageIO.read(is);
			result[0] = src.getWidth(null); // 得到源图宽
			result[1] = src.getHeight(null); // 得到源图高
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		return result;
	 * 获取图片大小 及 尺寸(测试)
	 * @param filePath
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	public static Float getImgWidthTest(String filePath) throws FileNotFoundException, IOException {
		//图片大小(文件大小)
		File picture = new File(filePath);
		Float size = Float.parseFloat(String.format("%.1f",
						picture.length() / 1024.0 / 1024.0));
		System.out.println("图片大小:" + size + "MB");
		//图片尺寸
		BufferedImage sourceImg  = ImageIO.read(new FileInputStream(picture));
		System.out.println("宽:" + sourceImg.getWidth());
		System.out.println("高:" + sourceImg.getHeight());
		return size;
	public static void main(String[] args) throws FileNotFoundException, IOException {
		System.out.println("图片压缩测试...");
		/*//获取图片大小
		CompressImgUtil.getImgWidthTest("D:/test.jpg");*/
		//图片压缩
		String srcFile = "D://test.jpg";
		String destFile = "D://tempCompressImg.jpg";
		//String destFile = "D://test.jpg";//相同路径可以覆盖
		File srcfile = new File(srcFile);
		System.out.println("压缩前srcfile size:" + srcfile.length());
		//压缩(相同路径可以覆盖)
		//CompressImgUtil.compressImg(srcFile, destFile, 600, 800, null);
		//CompressImgUtil.compressImg(srcFile, destFile, 110, 130, null);
		//CompressImgUtil.compressImg(srcFile, destFile, 110, 0, null);
		//CompressImgUtil.compressImg(srcFile, destFile, 0, 130, null);
		CompressImgUtil.compressImg(srcFile, destFile, 0, 0, Float.parseFloat("0.5"));
		File distfile = new File(destFile);
		System.out.println("压缩后distfile size:" + distfile.length());
		System.out.println("Finish!");

图片压缩-老版本(新架构打包时会报错“程序包com.sun.image.codec.jpeg不存在”)

CompressImgUtil.java

package com.qyj.utils;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class CompressImgUtil extends HttpServlet {
	private static final long serialVersionUID = 1L;
	 * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩(流模式 不保存中间文件)
	 * like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
	 * @param imgsrc 源图片地址
	 * @param out 目标图片地址
	 * @param widthdist 压缩后图片宽度(当rate==null时,必传)
	 * @param heightdist 压缩后图片高度(当rate==null时,必传)
	 * @param rate 压缩比例
	public static void compressImg(String imgsrc, ByteArrayOutputStream out, int widthdist,
								   int heightdist, Float rate) {
		try {
			File srcfile = new File(imgsrc);
			// 检查文件是否存在
			if (!srcfile.exists()) {
				return;
			// 如果rate不为空说明是按比例压缩
			if (rate != null && rate > 0) {
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					widthdist = (int) (results[0] * rate);
					heightdist = (int) (results[1] * rate);
			//like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
			else if(rate == null && widthdist > 0 && heightdist == 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(widthdist * 1.0 / results[0]);
					heightdist = (int) (results[1] * rate);
			else if(rate == null && widthdist == 0 && heightdist > 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(heightdist * 1.0 / results[1]);
					widthdist = (int) (results[0] * rate);
			// 开始读取文件并进行压缩
			Image src = ImageIO.read(srcfile);
			BufferedImage tag = new BufferedImage((int) widthdist,
					(int) heightdist, BufferedImage.TYPE_INT_RGB);
			tag.getGraphics().drawImage(
					src.getScaledInstance(widthdist, heightdist,
							Image.SCALE_SMOOTH), 0, 0, null);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(tag);
		} catch (IOException ex) {
			ex.printStackTrace();
	 * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩
	 * like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
	 * @param imgsrc 源图片地址
	 * @param imgdist 目标图片地址
	 * @param widthdist 压缩后图片宽度(当rate==null时,必传)
	 * @param heightdist 压缩后图片高度(当rate==null时,必传)
	 * @param rate 压缩比例
	public static void compressImg(String imgsrc, String imgdist, int widthdist,
			int heightdist, Float rate) {
		try {
			File srcfile = new File(imgsrc);
			// 检查文件是否存在
			if (!srcfile.exists()) {
				return;
			// 如果rate不为空说明是按比例压缩
			if (rate != null && rate > 0) {
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					widthdist = (int) (results[0] * rate);
					heightdist = (int) (results[1] * rate);
			//like12 modified,20220615,支持指定宽/高(高/宽自适应-使图片不失真)
			else if(rate == null && widthdist > 0 && heightdist == 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(widthdist * 1.0 / results[0]);
					heightdist = (int) (results[1] * rate);
			else if(rate == null && widthdist == 0 && heightdist > 0){
				// 获取文件高度和宽度
				int[] results = getImgWidth(srcfile);
				if (results == null || results[0] == 0 || results[1] == 0) {
					return;
				} else {
					rate = (float)(heightdist * 1.0 / results[1]);
					widthdist = (int) (results[0] * rate);
			// 开始读取文件并进行压缩
			Image src = ImageIO.read(srcfile);
			BufferedImage tag = new BufferedImage((int) widthdist,
					(int) heightdist, BufferedImage.TYPE_INT_RGB);
			tag.getGraphics().drawImage(
					src.getScaledInstance(widthdist, heightdist,
							Image.SCALE_SMOOTH), 0, 0, null);
			FileOutputStream out = new FileOutputStream(imgdist);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(tag);
			out.close();
		} catch (IOException ex) {
			ex.printStackTrace();
	 * 获取图片宽度
	 * @param file
	 *            图片文件
	 * @return 宽度
	public static int[] getImgWidth(File file) {
		InputStream is = null;
		BufferedImage src = null;
		int result[] = { 0, 0 };
		try {
			is = new FileInputStream(file);
			src = ImageIO.read(is);
			result[0] = src.getWidth(null); // 得到源图宽
			result[1] = src.getHeight(null); // 得到源图高
			is.close();
		} catch (Exception e) {
			e.printStackTrace();
		return result;
	 * 获取图片大小 及 尺寸(测试)
	 * @param filePath
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	public static Float getImgWidthTest(String filePath) throws FileNotFoundException, IOException {
		//图片大小(文件大小)
		File picture = new File(filePath);
		Float size = Float.parseFloat(String.format("%.1f",
						picture.length() / 1024.0 / 1024.0));
		System.out.println("图片大小:" + size + "MB");
		//图片尺寸
		BufferedImage sourceImg  = ImageIO.read(new FileInputStream(picture));
		System.out.println("宽:" + sourceImg.getWidth());
		System.out.println("高:" + sourceImg.getHeight());
		return size;
	public static void main(String[] args) throws FileNotFoundException, IOException {
		System.out.println("图片压缩测试...");
		/*//获取图片大小
		CompressImgUtil.getImgWidthTest("D:/test.jpg");*/
		//图片压缩
		String srcFile = "D://test.jpg";
		String destFile = "D://tempCompressImg.jpg";
		//String destFile = "D://test.jpg";//相同路径可以覆盖
		File srcfile = new File(srcFile);
		System.out.println("压缩前srcfile size:" + srcfile.length());
		//CompressImgUtil.compressImg(srcFile, destFile, 600, 800, null);
		//CompressImgUtil.compressImg(srcFile, destFile, 110, 130, null);
		//CompressImgUtil.compressImg(srcFile, destFile, 110, 0, null);
		//CompressImgUtil.compressImg(srcFile, destFile, 0, 130, null);
		CompressImgUtil.compressImg(srcFile, destFile, 0, 0, Float.parseFloat("0.5"));
		File distfile = new File(destFile);
		System.out.println("压缩后distfile size:" + distfile.length());
		System.out.println("Finish!");
                                    java获取图片的大小尺寸,有两种获取的源,一种是读取本地的图片获取大小尺寸,一种是通过服务器上图片的地址获取图片的尺寸!下面整理出这两种方式的简易代码,希望帮助的大家和自己!
我使用的Juint 进行的测试!
1:获取图片的大小尺寸
      * 本地获取
     @Test
     public void testImg2() throws IOException{
            File picture = new File("D:/5G.jpg")
                                    包括获取本地图片和远程服务器上的图片的尺寸大小,这里分别使用 BufferedImage 和 ImageReader 来获取图片信息,ImageReader 是通过从图片源信息中获取图片信息,所以速度会更快。获取本地图片信息BufferedImagepublic static Map<String, Object> getImageInfo(String filePath) {        lo
                                    java获取图片的长宽尺寸(毫米)
现在有个需求是附上 附件图片,同时要标注图片的一些属性,比较麻烦的要标识图片的长宽尺寸(毫米),网上找了半天都是获取图片的长宽像素,但是想了想 图片的长宽尺寸不应该是和像素和设备的分辨率有关系吗。唉,无奈需求就是要长宽尺寸,只能硬着头皮去做了,还好有点眉目,就这样做了……
通过org.apache.commons.imaging这个包能够获取到图片的物理尺寸,后来才知道这个尺寸好像是英寸,转换下就好了(1 英寸=25.4 毫米),直接上代码
public static P
$.imgUtil.calcNaturalWH
 $.imgUtil.calcNaturalWH 计算 img 的自然宽度/高度。 较新的浏览器具有 naturalWidth/naturalHeight 功能。 有了这些,我们就可以得到 img 的原始宽度/高度。 但是这些功能有时很难处理,因为它在 img 未加载完成之前失败并返回零。 $.imgUtil.calcNaturalWH 将 img 预加载为后台任务,然后返回您想要的值。 这也适用于使用棘手方式没有 naturalWidth/naturalHeight 功能的旧浏览器。
$.fn.imgCoverRect / $.fn.refreshImgCoverRect
 $.fn.imgCoverRect 调整 img 样式以覆盖容器。
$.fn.imgCoverRect / $