java 程序实现对图片的压缩生成缩略图并可设定长宽、尺寸压缩率、图片质量

来源:互联网 发布:炫踪网络 过会 编辑:程序博客网 时间:2024/04/27 14:54

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

 

参考代码:

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);elsenew_w = old_w;if (old_h > h)new_h = (int) Math.round(old_h / h2);// 计算新图长宽elsenew_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<filelist.length;i++){        String n=filelist[i].getName(); Tosmallerpic(f,filelist[i],"_middle",n,185,160,(float)0.7);  Tosmallerpic(f,filelist[i],"_small",n,45,45,(float)0.7);  Tosmallerpic(f,filelist[i],"_smaller",n,116,100,(float)0.7);  }      }  }}


 

 

第一次修改后的代码:

 

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();}}} 

 

 另见参考:http://www.javaeye.com/topic/266585

 

原创粉丝点击