ant打包JPEGImageEncoder报错的问题

本文介绍了一种在 Java 7 中使用 ImageIO 替代已移除的 JPEGImageEncoder 类来实现图片压缩的方法,并提供了详细的代码实现。

因为 jdk7 中将 JPEGImageEncoder 一除掉导致错误



 

 

 

 

解决方案:

最近做项目需要图片压缩处理,网上找的方法大都使用了 com.sun.image.codec.jpeg.* 这个包中的JPEGImageEncoder类,引入这个包后一直报错,各种google百度,尝试了各种方法,包括手动引jre中的rt.jar,以及在eclipse中把受访问限制的API提示从ERROR改为WARNING,等等,然而这些都是不好使的,因为后来我发现我的java-7-openjdk-amd64中的rt.jar里边根本就没有com.sun.image.*,貌似这个类在java7中已经被彻底remove了,至少我这个版本是没有了。然后搜了个使用ImageIO类来进行处理的替代方案,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
import  java.io.*;
import  java.util.logging.Level;
import  java.util.logging.Logger;
import  java.awt.*;
//旧的jpeg处理类
//import com.sun.image.codec.jpeg.*; 
import  java.awt.image.BufferedImage;
 
import  javax.imageio.IIOImage;
import  javax.imageio.ImageIO;
import  javax.imageio.ImageTypeSpecifier;
import  javax.imageio.metadata.IIOMetadata;
import  javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import  javax.imageio.stream.ImageOutputStream;
 
import  org.w3c.dom.Element;
 
import  com.sun.imageio.plugins.jpeg.*;
 
/**
  * @author zhouqz
  */
public  class  ImgCompressUtil {
 
     /**
      * log4j
      */
     private  final  static  Logger logger = Logger.getLogger(ImgCompressUtil. class
             .getName());
 
     /**
      * 图片压缩测试
     
      * @param args
      */
     public  static  void  main(String args[]) {
         // 图片url,压缩后的宽和高
         String url =  "/upload/c671c57023e6eb83a1fa492babf0779e.jpg" ;
         int  w =  700 ;
         int  h =  500 ;
         //压缩后的图片路径
             String newName = MD5Util.encodeMD5(url);
             String newDir =  "/var/imgcompress/" ;
             String filePath = newDir + newName +  "_"
                     + w +  "_"  + h + url.substring(url.indexOf( "." ));
         //压缩
         ImgCompress(url,filePath,w,h);
     }
 
     /**
      * 外部调用方法
      * @param url
      * @param w
      * @param h
      */
     public  static  String ImgCompress(String url, String filePath,  int  w,  int  h) {
             // 压缩质量 百分比
             float  JPEGcompression =  0 .7f;
 
             // 本地图片存储路径
             url =  "/var"  + url;
             String name = url.substring(url.lastIndexOf( "/" ) +  1 );
                         
             // 截取url中最后一个“/”之后的字符串为name
             logger.info( "url:==========="  + url);
             logger.info( "name:========="  + name);
             
             //压缩主方法
              return  ImgCompress(filePath, url, name, w, h, JPEGcompression);
         
     }
     
     /**
      * 图片压缩主方法
     
      * @param newDir
      *            图片所在的文件夹路径
      * @param file
      *            图片路径
      * @param name
      *            图片名
      * @param w
      *            目标宽
      * @param h
      *            目标高
      * @param JPEGcompression
      *            压缩质量/百分比
      * @author zhouqz
      */
     public  static  String ImgCompress(String filePath, String url, String name,
             int  w,  int  h,  float  JPEGcompression) {
         File file =  new  File(url);
         if  (!(file.exists() && file.canRead())) {
             filePath =  "/var/upload/404.jpg" ;
         } else {
             try  {
                 BufferedImage bufferedImage =  ImageIO.read(file);
                 
                 //注释掉的部分是将压缩后的图像调整为方形
//              int old_w = bufferedImage.getWidth(null); // 得到源图宽
//              int old_h = bufferedImage.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;
                 
                 int  new_w = w;
                 int  new_h = h; 
 
                 BufferedImage image_to_save =  new  BufferedImage(new_w, new_h,
                         bufferedImage.getType());
                 image_to_save.getGraphics().drawImage(
                         bufferedImage.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH),  0 ,
                         0 null );
                 FileOutputStream fos =  new  FileOutputStream(filePath);  // 输出到文件流
 
                 // 旧的使用 jpeg classes进行处理的方法
                 // JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
                 // JPEGEncodeParam jep =
                 // JPEGCodec.getDefaultJPEGEncodeParam(image_to_save);
                 /* 压缩质量 */
                 // jep.setQuality(per, true);
                 // encoder.encode(image_to_save, jep);
 
                 // 新的方法
                 int  dpi =  300 ; //分辨率
                 saveAsJPEG(dpi, image_to_save, JPEGcompression, fos);
                 //关闭输出流
                 fos.close();
                 //返回压缩后的图片地址
             catch  (IOException ex) {
                 logger.log(Level.SEVERE,  null , ex);
                 filePath =  "/var/upload/404.jpg" ;
             }
         }
         
         return  filePath;
         
     }
 
     /**
      * 以JPEG编码保存图片
     
      * @param dpi
      *            分辨率
      * @param image_to_save
      *            要处理的图像图片
      * @param JPEGcompression
      *            压缩比
      * @param fos
      *            文件输出流
      * @throws IOException
      */
     public  static  void  saveAsJPEG(Integer dpi, BufferedImage image_to_save,
             float  JPEGcompression, FileOutputStream fos)  throws  IOException {
 
         // useful documentation at
         // http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html
         // useful example program at
         // http://johnbokma.com/java/obtaining-image-metadata.html to output
         // JPEG data
 
         // old jpeg class
         // com.sun.image.codec.jpeg.JPEGImageEncoder jpegEncoder =
         // com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(fos);
         // com.sun.image.codec.jpeg.JPEGEncodeParam jpegEncodeParam =
         // jpegEncoder.getDefaultJPEGEncodeParam(image_to_save);
 
         // Image writer
         JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO
                 .getImageWritersBySuffix( "jpg" ).next();
         ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
         imageWriter.setOutput(ios);
         // and metadata
         IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(
                 new  ImageTypeSpecifier(image_to_save),  null );
 
         // if(dpi != null && !dpi.equals("")){
         //
         // //old metadata
         // //jpegEncodeParam.setDensityUnit(com.sun.image.codec.jpeg.JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
         // //jpegEncodeParam.setXDensity(dpi);
         // //jpegEncodeParam.setYDensity(dpi);
         //
         // //new metadata
         // Element tree = (Element)
         // imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
         // Element jfif =
         // (Element)tree.getElementsByTagName("app0JFIF").item(0);
         // jfif.setAttribute("Xdensity", Integer.toString(dpi) );
         // jfif.setAttribute("Ydensity", Integer.toString(dpi));
         //
         // }
 
         if  (JPEGcompression >=  0  && JPEGcompression <= 1f) {
 
             // old compression
             // jpegEncodeParam.setQuality(JPEGcompression,false);
 
             // new Compression
             JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter
                     .getDefaultWriteParam();
             jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
             jpegParams.setCompressionQuality(JPEGcompression);
 
         }
 
         // old write and clean
         // jpegEncoder.encode(image_to_save, jpegEncodeParam);
 
         // new Write and clean up
         imageWriter.write(imageMetaData,
                 new  IIOImage(image_to_save,  null null ),  null );
         ios.close();
         imageWriter.dispose();
 
     }
 
}
 
转自:http://my.oschina.net/JustLoveIT/blog/474004
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值