标签:
1 package com.goalwisdom.gwnis.util.imgCompress; 2 import java.io.*; 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.awt.*; 6 import java.awt.image.*; 7 import javax.imageio.ImageIO; 8 9 import com.goalwisdom.gwnis.base.ServerConfig; 10 import com.sun.image.codec.jpeg.*; 11 /** 12 * 图片压缩处理 13 * @author 刘立文 14 */ 15 public class ImgCompress{ 16 //服务器项目路径 17 private String serverPath; 18 //头像压缩前图片文件夹(项目服务器所在文件夹下载的子文件夹,即类似 image/headPath 这种) 19 private String headPath; 20 //头像压缩后图片目标文件夹 21 private String goalHeadPath; 22 //朋友圈图片压缩前文件夹 23 private String friendPath; 24 //朋友圈图片压缩后文件夹 25 private String goalFriendPath; 26 //压缩后的宽高 27 private final static int GOAL_HEIGHT=100; 28 private final static int GOAL_WIDTH=100; 29 30 /** 构造函数 */ 31 public ImgCompress(String serverPath) throws IOException { 32 this.serverPath=serverPath; 33 headPath=ServerConfig.getHeadPortraitImagePath(); 34 goalHeadPath=ServerConfig.getCompressionHeadPortraitImagePath(); 35 friendPath=ServerConfig.getImagePath(); 36 goalFriendPath=ServerConfig.getCompressionImagePath(); 37 } 38 39 /** 40 * 方法: compressHeadImage <br> 41 * 描述: 在头像图片文件夹中搜索对应图片,存放到压缩文件夹 <br> 42 * 作者: liuliwen <br> 43 * 时间: 2016-7-10 下午4:44:29 44 * @param imageName 头像名 45 * @throws Exception 46 */ 47 public void compressHeadImage(String imageName) throws Exception{ 48 String imgP=serverPath+"\\"+headPath+"\\"+imageName; 49 String gImgP=serverPath+"\\"+goalHeadPath+"\\"+imageName; 50 compressImage(imgP, gImgP); 51 } 52 53 /** 54 * 方法: compressFriendImage <br> 55 * 描述: 在朋友圈图片文件夹中搜索对应图片,存放到压缩文件夹 <br> 56 * 作者: liuliwen <br> 57 * 时间: 2016-7-10 下午4:44:39 58 * @param imageNameList 图片名集合 59 * @throws Exception 60 */ 61 public void compressFriendImage(List<String> imageNameList) throws Exception{ 62 String imgP,gImgP; 63 for(String imageName:imageNameList){ 64 imgP=serverPath+"\\"+friendPath+"\\"+imageName; 65 gImgP=serverPath+"\\"+goalFriendPath+"\\"+imageName; 66 compressImage(imgP, gImgP); 67 } 68 } 69 70 /** 71 * 方法: compressImage <br> 72 * 描述: 压缩指定图片到生成目标图片文件 <br> 73 * 作者: liuliwen <br> 74 * 时间: 2016-7-10 下午4:41:46 75 * @param imgP 指定图片 76 * @param gImgP 目标图片 77 * @throws Exception 78 */ 79 @SuppressWarnings("restriction") 80 private void compressImage(String imgP,String gImgP)throws Exception{ 81 File file = new File(imgP);// 读入文件 82 Image img = ImageIO.read(file); // 构造Image对象 83 BufferedImage image=resizeFix(img); 84 File destFile = new File(gImgP); 85 FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流 86 // 可以正常实现bmp、png、gif转jpg 87 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 88 encoder.encode(image); // JPEG编码 89 out.close(); 90 } 91 92 /** 93 * 图片处理,按照宽度还是高度进行压缩 94 * @param img Image 图片对象 95 * @param goalPath String 压缩后的目标文件夹 96 * @return 返回压缩后的图片缓存对象 97 */ 98 private BufferedImage resizeFix(Image img) throws IOException { 99 int width = img.getWidth(null); // 得到源图宽 100 int height = img.getHeight(null); // 得到源图长 101 if (width / height > GOAL_WIDTH / GOAL_HEIGHT) { 102 //以宽度为基准,等比例放缩图片 103 int h = (int) (height * GOAL_WIDTH / width); 104 return resize(GOAL_WIDTH, h,img); 105 } else { 106 //以高度为基准,等比例缩放图片 107 int w = (int) (width * GOAL_HEIGHT / height); 108 return resize(w, GOAL_HEIGHT,img); 109 } 110 } 111 /** 112 * 方法: resize <br> 113 * 描述: 调整大小,返回调整后的图片对象 <br> 114 * 作者: liuliwen <br> 115 * 时间: 2016-7-10 下午4:14:16 116 * @throws IOException 117 */ 118 private BufferedImage resize(int w, int h,Image img) throws IOException { 119 // SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢 120 BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB ); 121 image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图 122 return image; 123 } 124 125 126 public static void main(String[] args){ 127 try { 128 ImgCompress imgcomprss=new ImgCompress("G:\\apache-tomcat-7.0.54\\webapps\\extenddemo"); 129 try { 130 List<String> list=new ArrayList<String>(); 131 list.add("7c9b3640f8514ec48a5f5a20724dffe5.jpg"); 132 list.add("9f96e13b8b874325afda0bebede3e1a9.jpg"); 133 // imgcomprss.compressHeadImage("a6cc652ef8d34e2e8c3780510ff81c4e.jpg"); 134 imgcomprss.compressFriendImage(list); 135 } catch (Exception e) { 136 e.printStackTrace(); 137 } 138 } catch (IOException e) { 139 e.printStackTrace(); 140 } 141 } 142 }
感谢 java小强 http://cuisuqiang.iteye.com/ 的原创分享,
自己加入到项目中使用,需求是实现类似朋友圈的功能,修改了一下代码,做成了一个工具类,可以分别处理单张图片(头像),和多张图片的压缩和存放。
目录统一配置在项目的配置文件application.properties中,使用一个统一的工具类ServerConfig进行读取。在用户图片上传时,异步处理图片压缩。
application.properties中的配置和读取工具类
1 #friend dynamic image 2 imagePath=image 3 compressionImage=image/compression 4 #head portrait image 5 headPortraitImage=headPortraitImage 6 compressionHeadPortraitImage=headPortraitImage/compression
1 package com.goalwisdom.gwnis.base; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.Properties; 6 7 /** 8 * Created by tzw on 15/2/11. 9 */ 10 public class ServerConfig { 11 private static Properties prop; 12 static{ 13 prop = new Properties(); 14 InputStream inputStream = Thread.currentThread() 15 .getContextClassLoader() 16 .getResourceAsStream("application.properties"); 17 try { 18 prop.load(inputStream); 19 } catch (IOException e) { 20 e.printStackTrace(); 21 } 22 } 23 24 /** 25 * 获取朋友圈图片 26 * */ 27 public static String getImagePath() { 28 return prop.getProperty("imagePath"); 29 } 30 31 /** 32 * 获取朋友圈压缩后图片 33 * */ 34 public static String getCompressionImagePath() { 35 return prop.getProperty("compressionImage"); 36 } 37 38 /** 39 * 获取头像图片 40 * */ 41 public static String getHeadPortraitImagePath() { 42 return prop.getProperty("headPortraitImage"); 43 } 44 45 /** 46 * 获取头像压缩后图片 47 * */ 48 public static String getCompressionHeadPortraitImagePath() { 49 return prop.getProperty("compressionHeadPortraitImage"); 50 } 51 52 53 }
和进行异步处理的类
1 package com.goalwisdom.gwnis.util.imgCompress; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 public class ImgCompressThread extends Thread{ 7 private final String path; 8 private final String imageName; 9 private final List<String> imageNameList; 10 11 public void run(){ 12 ImgCompress imgcomprss; 13 try { 14 imgcomprss = new ImgCompress(path); 15 imgcomprss.compressHeadImage(imageName); 16 } catch (IOException e) { 17 e.printStackTrace(); 18 }catch (Exception e) { 19 e.printStackTrace(); 20 } 21 } 22 23 public String getPath() { 24 return path; 25 } 26 27 public String getImageName() { 28 return imageName; 29 } 30 31 public List<String> getImageNameList() { 32 return imageNameList; 33 } 34 35 public ImgCompressThread(String path, String imageName) { 36 super(); 37 this.path = path; 38 this.imageName = imageName; 39 this.imageNameList = null; 40 } 41 42 public ImgCompressThread(String path,List<String> imageNameList) { 43 super(); 44 this.path = path; 45 this.imageName = null; 46 this.imageNameList = imageNameList; 47 } 48 }
调用代码
//压缩图片 Thread t = new ImgCompressThread(contextPath,imageName); t.start();
写给自己这种伸手党,虽然没有过找人求代码,但是这种想法还是有的(万一要是有人给你写了呢),命名不怎么规范,英文不好,所以平时自己尽量多写中文注释
标签:
原文地址:http://www.cnblogs.com/Ebird/p/5658238.html