码迷,mamicode.com
首页 > 其他好文 > 详细

为类似朋友圈的需求所做的图片压缩处理

时间:2016-07-10 18:16:21      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

  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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!