博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 程序实现对图片的压缩生成缩略图并可设定长宽、尺寸压缩率、图片质量...
阅读量:6481 次
发布时间:2019-06-23

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

hot3.png

之前是在另一位高手的上传内容中学习到的,并将其代码根据我的需求进行了修改,参考位置:

 

参考代码:

import java.io.*;import java.util.logging.Level;import java.util.logging.Logger;import java.awt.*;import com.sun.image.codec.jpeg.*;import java.awt.image.BufferedImage;public class Img_Middle {	public void img_change(String url, String name) {		Tosmallerpic(url, new File(url + name), "_middle", name, 188, 165,				(float) 0.7);		Tosmallerpic(url, new File(url + name), "_small", name, 45, 45,				(float) 0.7);		Tosmallerpic(url, new File(url + name), "_smaller", name, 116, 100,				(float) 0.7);	}	/**	 * * * @param f 图片所在的文件夹路径 * @param filelist 图片路径 *	 * 	 * @param ext	 *            扩展名	 * @param n	 *            图片名	 * @param w	 *            目标宽 *	 * @param h	 *            目标高 *	 * @param per	 *            百分比	 */	private static void Tosmallerpic(String f, File filelist, String ext,			String n, int w, int h, float per) {		Image src;		try {			src = javax.imageio.ImageIO.read(filelist);			// 构造Image对象			String img_midname = f + n.substring(0, n.indexOf(".")) + ext					+ n.substring(n.indexOf("."));			int old_w = src.getWidth(null); // 得到源图宽			int old_h = src.getHeight(null);			int new_w = 0;			int new_h = 0; // 得到源图长			double w2 = (old_w * 1.00) / (w * 1.00);			double h2 = (old_h * 1.00) / (h * 1.00);			// 图片跟据长宽留白,成一个正方形图。			BufferedImage oldpic;			if (old_w > old_h) {				oldpic = new BufferedImage(old_w, old_w,						BufferedImage.TYPE_INT_RGB);			} else {				if (old_w < old_h) {					oldpic = new BufferedImage(old_h, old_h,							BufferedImage.TYPE_INT_RGB);				} else {					oldpic = new BufferedImage(old_w, old_h,							BufferedImage.TYPE_INT_RGB);				}			}			Graphics2D g = oldpic.createGraphics();			g.setColor(Color.white);			if (old_w > old_h) {				g.fillRect(0, 0, old_w, old_w);				g.drawImage(src, 0, (old_w - old_h) / 2, old_w, old_h,						Color.white, null);			} else {				if (old_w < old_h) {					g.fillRect(0, 0, old_h, old_h);					g.drawImage(src, (old_h - old_w) / 2, 0, old_w, old_h,							Color.white, null);				} else {					// g.fillRect(0,0,old_h,old_h);					g.drawImage(src.getScaledInstance(old_w, old_h,							Image.SCALE_SMOOTH), 0, 0, null);				}			}			g.dispose();			src = oldpic;			// 图片调整为方形结束			if (old_w > w)				new_w = (int) Math.round(old_w / w2);			else				new_w = old_w;			if (old_h > h)				new_h = (int) Math.round(old_h / h2);// 计算新图长宽			else				new_h = old_h;			BufferedImage tag = new BufferedImage(new_w, new_h,					BufferedImage.TYPE_INT_RGB);			// tag.getGraphics().drawImage(src,0,0,new_w,new_h,null);			// 绘制缩小后的图			tag.getGraphics().drawImage(					src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,					0, null);			FileOutputStream newimage = new FileOutputStream(img_midname); // 输出到文件流			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);			JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);			/* 压缩质量 */			jep.setQuality(per, true);			encoder.encode(tag, jep);			// encoder.encode(tag);			// 近JPEG编码			newimage.close();		} catch (IOException ex) {			Logger.getLogger(Img_Middle.class.getName()).log(Level.SEVERE,					null, ex);		}	}		public static void main(String args[]){      		//String n="0e5465fc-025a-458d-8383-e9ced0c1e728.jpg";    		String f="F://200903300012//pics//201006//";   		File file=new File(f);        		if(file.exists()){      			File[] filelist=file.listFiles(); 			for(int i=0;i

第一次修改后的代码:

import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Calendar;import java.util.Date;import com.sun.image.codec.jpeg.ImageFormatException;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGEncodeParam;import com.sun.image.codec.jpeg.JPEGImageEncoder;/** * * @author WQ *  * @date 2011-01-14 * @versions 1.0 图片压缩工具类 提供的方法中可以设定生成的 缩略图片的大小尺寸、压缩尺寸的比例、图片的质量等 */public class ImageUtil {	/**	 * * 图片文件读取	 * 	 * @param srcImgPath	 * @return	 */	private static BufferedImage InputImage(String srcImgPath) {		BufferedImage srcImage = null;		try {			// 构造BufferedImage对象			File file = new File(srcImgPath);			FileInputStream in = new FileInputStream(file);			byte[] b = new byte[5];			in.read(b);			srcImage = javax.imageio.ImageIO.read(file);		} catch (IOException e) {			System.out.println("读取图片文件出错!" + e.getMessage());			e.printStackTrace();		}		return srcImage;	}	/**	 * * 将图片按照指定的图片尺寸、源图片质量压缩(默认质量为1)	 * 	 * @param srcImgPath	 *            :源图片路径	 * @param outImgPath	 *            :输出的压缩图片的路径	 * @param new_w	 *            :压缩后的图片宽	 * @param new_h	 *            :压缩后的图片高	 */	public static void Tosmallerpic(String srcImgPath, String outImgPath,			int new_w, int new_h) {		Tosmallerpic(srcImgPath, outImgPath, new_w, new_h, 1F);	}	/**	 * 将图片按照指定的尺寸比例、源图片质量压缩(默认质量为1)	 * 	 * @param srcImgPath	 *            :源图片路径	 * @param outImgPath	 *            :输出的压缩图片的路径	 * @param ratio	 *            :压缩后的图片尺寸比例	 * @param per	 *            :百分比	 */	public static void Tosmallerpic(String srcImgPath, String outImgPath,			float ratio) {		Tosmallerpic(srcImgPath, outImgPath, ratio, 1F);	}	/**	 * 将图片按照指定长或者宽的最大值来压缩图片(默认质量为1)	 * 	 * @param srcImgPath	 *            :源图片路径	 * @param outImgPath	 *            :输出的压缩图片的路径	 * @param maxLength	 *            :长或者宽的最大值	 * @param per	 *            :图片质量	 */	public static void Tosmallerpic(String srcImgPath, String outImgPath,			int maxLength) {		Tosmallerpic(srcImgPath, outImgPath, maxLength, 1F);	}	/**	 * * 将图片按照指定的图片尺寸、图片质量压缩	 * 	 * @param srcImgPath	 *            :源图片路径	 * @param outImgPath	 *            :输出的压缩图片的路径	 * @param new_w	 *            :压缩后的图片宽	 * @param new_h	 *            :压缩后的图片高	 * @param per	 *            :百分比	 */	public static void Tosmallerpic(String srcImgPath, String outImgPath,			int new_w, int new_h, float per) {		// 得到图片		BufferedImage src = InputImage(srcImgPath);		int old_w = src.getWidth();		// 得到源图宽		int old_h = src.getHeight();		// 得到源图长		// 根据原图的大小生成空白画布		BufferedImage tempImg = new BufferedImage(old_w, old_h,				BufferedImage.TYPE_INT_RGB);		// 在新的画布上生成原图的缩略图		Graphics2D g = tempImg.createGraphics();		g.setColor(Color.white);		g.fillRect(0, 0, old_w, old_h);		g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);		g.dispose();		BufferedImage newImg = new BufferedImage(new_w, new_h,				BufferedImage.TYPE_INT_RGB);		newImg.getGraphics().drawImage(				tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,				0, null);		// 调用方法输出图片文件		OutImage(outImgPath, newImg, per);	}	/**	 * * 将图片按照指定的尺寸比例、图片质量压缩	 * 	 * @param srcImgPath	 *            :源图片路径	 * @param outImgPath	 *            :输出的压缩图片的路径	 * @param ratio	 *            :压缩后的图片尺寸比例	 * @param per	 *            :百分比	 */	public static void Tosmallerpic(String srcImgPath, String outImgPath,			float ratio, float per) {		// 得到图片		BufferedImage src = InputImage(srcImgPath);		int old_w = src.getWidth();		// 得到源图宽		int old_h = src.getHeight();		// 得到源图长		int new_w = 0;		// 新图的宽		int new_h = 0;		// 新图的长		BufferedImage tempImg = new BufferedImage(old_w, old_h,				BufferedImage.TYPE_INT_RGB);		Graphics2D g = tempImg.createGraphics();		g.setColor(Color.white);		// 从原图上取颜色绘制新图g.fillRect(0, 0, old_w, old_h);		g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);		g.dispose();		// 根据图片尺寸压缩比得到新图的尺寸new_w = (int) Math.round(old_w * ratio);		new_h = (int) Math.round(old_h * ratio);		BufferedImage newImg = new BufferedImage(new_w, new_h,				BufferedImage.TYPE_INT_RGB);		newImg.getGraphics().drawImage(				tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,				0, null);		// 调用方法输出图片文件OutImage(outImgPath, newImg, per);	}	/**	 * * 指定长或者宽的最大值来压缩图片	 * 	 * @param srcImgPath	 *            :源图片路径	 * @param outImgPath	 *            :输出的压缩图片的路径	 * @param maxLength	 *            :长或者宽的最大值	 * @param per	 *            :图片质量	 */	public static void Tosmallerpic(String srcImgPath, String outImgPath,			int maxLength, float per) {		// 得到图片		BufferedImage src = InputImage(srcImgPath);		int old_w = src.getWidth();		// 得到源图宽		int old_h = src.getHeight();		// 得到源图长		int new_w = 0;		// 新图的宽		int new_h = 0;		// 新图的长		BufferedImage tempImg = new BufferedImage(old_w, old_h,				BufferedImage.TYPE_INT_RGB);		Graphics2D g = tempImg.createGraphics();		g.setColor(Color.white);		// 从原图上取颜色绘制新图		g.fillRect(0, 0, old_w, old_h);		g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);		g.dispose();		// 根据图片尺寸压缩比得到新图的尺寸		if (old_w > old_h) {			// 图片要缩放的比例			new_w = maxLength;			new_h = (int) Math.round(old_h * ((float) maxLength / old_w));		} else {			new_w = (int) Math.round(old_w * ((float) maxLength / old_h));			new_h = maxLength;		}		BufferedImage newImg = new BufferedImage(new_w, new_h,				BufferedImage.TYPE_INT_RGB);		newImg.getGraphics().drawImage(				tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,				0, null);		// 调用方法输出图片文件		OutImage(outImgPath, newImg, per);	}	/**	 * * 将图片文件输出到指定的路径,并可设定压缩质量	 * 	 * @param outImgPath	 * @param newImg	 * @param per	 */	private static void OutImage(String outImgPath, BufferedImage newImg,			float per) {		// 判断输出的文件夹路径是否存在,不存在则创建		File file = new File(outImgPath);		if (!file.getParentFile().exists()) {			file.getParentFile().mkdirs();		}// 输出到文件流		try {			FileOutputStream newimage = new FileOutputStream(outImgPath);			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);			JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(newImg);			// 压缩质量			jep.setQuality(per, true);			encoder.encode(newImg, jep);			newimage.close();		} catch (FileNotFoundException e) {			// TODO Auto-generated catch blocke.printStackTrace();		} catch (ImageFormatException e) {			// TODO Auto-generated catch blocke.printStackTrace();		} catch (IOException e) {			// TODO Auto-generated catch blocke.printStackTrace();		}	}	public static void main(String args[]) {		String f = "c:/img/";		File file = new File(f);		if (file.exists()) {			File[] filelist = file.listFiles();			for (int i = 0; i < filelist.length; i++) {				File fi = filelist[i];				System.out.println(fi.length());				String n = filelist[i].getName();				// Tosmallerpic(f, filelist[i], "_ratio_small", n,				// 0.303,(float)0.7);				// Tosmallerpic(f, filelist[i], "_ratio_smaller", n,				// 0.083,(float)0.7);			}		}		String srcImg = "c:/img/car_2.jpg";		String tarDir = "c:/img/newImg/";		long startTime = new Date().getTime();		Tosmallerpic(srcImg, tarDir + "car_1_maxLength_1.jpg", 400);		Tosmallerpic(srcImg, tarDir + "car_1_maxLength_2.jpg", 0.5F);		Tosmallerpic(srcImg, tarDir + "car_1_maxLength_3.jpg", 400, 500);		Tosmallerpic(srcImg, tarDir + "car_1_maxLength_11.jpg", 400, 0.7F);		Tosmallerpic(srcImg, tarDir + "car_1_maxLength_22.jpg", 0.5F, 0.8F);		Tosmallerpic(srcImg, tarDir + "car_1_maxLength_33.jpg", 400, 500, 0.8F);		System.out.println(new Date().getTime() - startTime);	}}

第二次修改,只是对长宽尺寸压缩,按原图片质量

import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import javax.imageio.ImageIO;/** * * @author WQ * @date 2011-01-14 * @versions 1.0 图片压缩工具类 提供的方法中可以设定生成的 * 缩略图片的大小尺寸等 */public class ImageUtil {	/** * 图片文件读取 * * @param srcImgPath * @return */	private static BufferedImage InputImage(String srcImgPath) {		BufferedImage srcImage = null;		try {			FileInputStream in = new FileInputStream(srcImgPath);			srcImage = javax.imageio.ImageIO.read(in);		} catch (IOException e) {			System.out.println("读取图片文件出错!" + e.getMessage());			e.printStackTrace();		}		return srcImage;	}	/**	 * * 将图片按照指定的图片尺寸压缩 * * @param srcImgPath :源图片路径 * @param outImgPath *	 * :输出的压缩图片的路径 * @param new_w * :压缩后的图片宽 * @param new_h * :压缩后的图片高	 */	public static void compressImage(String srcImgPath, String outImgPath,			int new_w, int new_h) {		BufferedImage src = InputImage(srcImgPath);		disposeImage(src, outImgPath, new_w, new_h);	}	/**	 * * 指定长或者宽的最大值来压缩图片 * * @param srcImgPath * :源图片路径 * @param outImgPath *	 * :输出的压缩图片的路径 * @param maxLength * :长或者宽的最大值	 */	public static void compressImage(String srcImgPath, String outImgPath,			int maxLength) {		// 得到图片		BufferedImage src = InputImage(srcImgPath);		if (null != src) {			int old_w = src.getWidth();			// 得到源图宽			int old_h = src.getHeight();			// 得到源图长			int new_w = 0;			// 新图的宽			int new_h = 0;			// 新图的长			// 根据图片尺寸压缩比得到新图的尺寸			if (old_w > old_h) {				// 图片要缩放的比例				new_w = maxLength;				new_h = (int) Math.round(old_h * ((float) maxLength / old_w));			} else {				new_w = (int) Math.round(old_w * ((float) maxLength / old_h));				new_h = maxLength;			}			disposeImage(src, outImgPath, new_w, new_h);		}	}	/** * 处理图片 * * @param src * @param outImgPath * @param new_w * @param new_h */	private synchronized static void disposeImage(BufferedImage src,			String outImgPath, int new_w, int new_h) {		// 得到图片		int old_w = src.getWidth();		// 得到源图宽		int old_h = src.getHeight();		// 得到源图长		BufferedImage newImg = null;		// 判断输入图片的类型		switch (src.getType()) {		case 13:			// png,gifnewImg = new BufferedImage(new_w, new_h,			// BufferedImage.TYPE_4BYTE_ABGR);			break;		default:			newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);			break;		}		Graphics2D g = newImg.createGraphics();		// 从原图上取颜色绘制新图		g.drawImage(src, 0, 0, old_w, old_h, null);		g.dispose();		// 根据图片尺寸压缩比得到新图的尺寸		newImg.getGraphics().drawImage(				src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0,				null);		// 调用方法输出图片文件		OutImage(outImgPath, newImg);	}	/**	 * * 将图片文件输出到指定的路径,并可设定压缩质量 * * @param outImgPath * @param newImg * @param	 * per	 */	private static void OutImage(String outImgPath, BufferedImage newImg) {		// 判断输出的文件夹路径是否存在,不存在则创建		File file = new File(outImgPath);		if (!file.getParentFile().exists()) {			file.getParentFile().mkdirs();		}// 输出到文件流		try {			ImageIO.write(newImg, outImgPath.substring(outImgPath					.lastIndexOf(".") + 1), new File(outImgPath));		} catch (FileNotFoundException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}	}}

另见参考:

转载于:https://my.oschina.net/crazybird/blog/620202

你可能感兴趣的文章
Loadrunner检查点小结(很经典)
查看>>
MySQL字段类型详解
查看>>
ORACLE 的游标
查看>>
虚拟机安装的UBUNTU全屏的方法:
查看>>
java虚拟机类加载器
查看>>
ASP.NET状态管理之八(会话Session)
查看>>
I.MX6 Android 5.1.1 下载、编译
查看>>
background
查看>>
转载:大型网站架构演变和知识体系
查看>>
set集合
查看>>
SVN服务器的搭建和使用
查看>>
mvc中枚举的使用和绑定枚举值到DropDownListFor
查看>>
多目标跟踪的评价指标
查看>>
python 生成器
查看>>
HTTPS(SSL)详解以及PHP调用方法
查看>>
突发小事件,USB接口问题
查看>>
Nginx负载均衡配置实例详解
查看>>
L1-009. N个数求和
查看>>
实参传递不当导致的运行时错误
查看>>
PHP生成静态html文件 的三种方法
查看>>