自己封装的一个Java版图片工具,具备压缩,伸缩变换,透明处理,格式转换等功能.
网络传输过程中,为什么要对图像和视频流进行压缩
第一,压缩的必要性:
图象和视频通常在计算机中表示后会占用非常大的空间,而出于节省硬盘空间的考虑,往往要进行压缩。同时,传输过程中,为了节省珍贵的带宽资源和节省时间,也迫切要求压缩。压缩之后,传输过程中的误码率也会相应地减少。
第二,压缩的可能性:
人眼对颜色只有一定的感应能力,当某些颜色十分相近时,人是感觉不出差异的(或者很小)。这一点为压缩提供了机会。我们把相近的颜色用一种颜色表示,从而减少了图象的存储空间,实现压缩。同时,通过解压缩,我们可以根据之前采取的压缩方法(有损压缩、无损压缩等)进行相应的解压缩措施,保证图象的真度恢复。
下面是个人封装的工具,具有用户自定义图片压缩水印(图片水印,文字水印)、图片透明处理、灰白处理、格式获取、格式转换、物理存储、处理中介BufferedImage等模块.
代码全贴,含注释, 个人娱乐之作,不喜勿喷! 菜鸟一枚,求指点.
1 package org.dennisit.org.util;
2 import java.awt.AlphaComposite;
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.Graphics2D;
6 import java.awt.Image;
7 import java.awt.color.ColorSpace;
8 import java.awt.image.BufferedImage;
9 import java.awt.image.ColorConvertOp;
10 import java.io.ByteArrayInputStream;
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.IOException;
14 import java.util.Iterator;
15
16 import javax.imageio.ImageIO;
17 import javax.imageio.ImageReader;
18 import javax.imageio.stream.MemoryCacheImageInputStream;
19
20 import com.sun.imageio.plugins.bmp.BMPImageReader;
21 import com.sun.imageio.plugins.gif.GIFImageReader;
22 import com.sun.imageio.plugins.jpeg.JPEGImageReader;
23 import com.sun.imageio.plugins.png.PNGImageReader;
24
25 /**
26 *
27 * @version : 1.1
28 *
29 * @author : 苏若年 <a href="mailto:DennisIT@163.com">发送邮件</a>
30 *
31 * @since : 1.0 创建时间: 2012-12-28 上午11:15:03
32 *
33 * @function: 图片工具类
34 *
35 *
36 *
37 */
38
39 public class PictureUtil {
40
41 public static final float DEFAULT_QUALITY = 0.2125f ;
42
43
44 /**
45 *
46 * 添加图片水印操作(物理存盘,使用默认格式)
47 *
48 * @param imgPath
49 * 待处理图片
50 * @param markPath
51 * 水印图片
52 * @param x
53 * 水印位于图片左上角的 x 坐标值
54 * @param y
55 * 水印位于图片左上角的 y 坐标值
56 * @param alpha
57 * 水印透明度 0.1f ~ 1.0f
58 * @param destPath
59 * 文件存放路径
60 * @throws Exception
61 *
62 */
63 public static void addWaterMark(String imgPath, String markPath, int x, int y, float alpha,String destPath) throws Exception{
64 try {
65 BufferedImage bufferedImage = addWaterMark(imgPath, markPath, x, y, alpha);
66 ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
67 } catch (Exception e) {
68 throw new RuntimeException("添加图片水印异常");
69 }
70 }
71
72
73 /**
74 *
75 * 添加图片水印操作(物理存盘,自定义格式)
76 *
77 * @param imgPath
78 * 待处理图片
79 * @param markPath
80 * 水印图片
81 * @param x
82 * 水印位于图片左上角的 x 坐标值
83 * @param y
84 * 水印位于图片左上角的 y 坐标值
85 * @param alpha
86 * 水印透明度 0.1f ~ 1.0f
87 * @param format
88 * 添加水印后存储的格式
89 * @param destPath
90 * 文件存放路径
91 * @throws Exception
92 *
93 */
94 public static void addWaterMark(String imgPath, String markPath, int x, int y, float alpha,String format,String destPath) throws Exception{
95 try {
96 BufferedImage bufferedImage = addWaterMark(imgPath, markPath, x, y, alpha);
97 ImageIO.write(bufferedImage,format , new File(destPath));
98 } catch (Exception e) {
99 throw new RuntimeException("添加图片水印异常");
100 }
101 }
102
103
104 /**
105 *
106 * 添加图片水印操作,返回BufferedImage对象
107 *
108 * @param imgPath
109 * 待处理图片
110 * @param markPath
111 * 水印图片
112 * @param x
113 * 水印位于图片左上角的 x 坐标值
114 * @param y
115 * 水印位于图片左上角的 y 坐标值
116 * @param alpha
117 * 水印透明度 0.1f ~ 1.0f
118 * @return
119 * 处理后的图片对象
120 * @throws Exception
121 *
122 */
123 public static BufferedImage addWaterMark(String imgPath, String markPath, int x, int y, float alpha) throws Exception{
124 BufferedImage targetImage = null;
125 try {
126 // 加载待处理图片文件
127 Image img = ImageIO.read(new File(imgPath));
128
129 //创建目标图象文件
130 targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
131 Graphics2D g = targetImage.createGraphics();
132 g.drawImage(img, 0, 0, null);
133
134 // 加载水印图片文件
135 Image markImg = ImageIO.read(new File(markPath));
136 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
137 g.drawImage(markImg, x, y, null);
138 g.dispose();
139 } catch (Exception e) {
140 throw new RuntimeException("添加图片水印操作异常");
141 }
142 return targetImage;
143
144 }
145
146
147
148 /**
149 *
150 * 添加文字水印操作(物理存盘,使用默认格式)
151 *
152 * @param imgPath
153 * 待处理图片
154 * @param text
155 * 水印文字
156 * @param font
157 * 水印字体信息 不写默认值为宋体
158 * @param color
159 * 水印字体颜色
160 * @param x
161 * 水印位于图片左上角的 x 坐标值
162 * @param y
163 * 水印位于图片左上角的 y 坐标值
164 * @param alpha
165 * 水印透明度 0.1f ~ 1.0f
166 * @param format
167 * 添加水印后存储的格式
168 * @param destPath
169 * 文件存放路径
170 * @throws Exception
171 */
172 public static void addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha,String destPath) throws Exception{
173 try {
174 BufferedImage bufferedImage = addTextMark(imgPath, text, font, color, x, y, alpha);
175 ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
176 } catch (Exception e) {
177 throw new RuntimeException("图片添加文字水印异常");
178 }
179 }
180
181 /**
182 *
183 * 添加文字水印操作(物理存盘,自定义格式)
184 *
185 * @param imgPath
186 * 待处理图片
187 * @param text
188 * 水印文字
189 * @param font
190 * 水印字体信息 不写默认值为宋体
191 * @param color
192 * 水印字体颜色
193 * @param x
194 * 水印位于图片左上角的 x 坐标值
195 * @param y
196 * 水印位于图片左上角的 y 坐标值
197 * @param alpha
198 * 水印透明度 0.1f ~ 1.0f
199 * @param format
200 * 添加水印后存储的格式
201 * @param destPath
202 * 文件存放路径
203 * @throws Exception
204 */
205 public static void addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha,String format,String destPath) throws Exception{
206 try {
207 BufferedImage bufferedImage = addTextMark(imgPath, text, font, color, x, y, alpha);
208 ImageIO.write(bufferedImage, format, new File(destPath));
209 } catch (Exception e) {
210 throw new RuntimeException("图片添加文字水印异常");
211 }
212 }
213
214 /**
215 *
216 * 添加文字水印操作,返回BufferedImage对象
217 *
218 * @param imgPath
219 * 待处理图片
220 * @param text
221 * 水印文字
222 * @param font
223 * 水印字体信息 不写默认值为宋体
224 * @param color
225 * 水印字体颜色
226 * @param x
227 * 水印位于图片左上角的 x 坐标值
228 * @param y
229 * 水印位于图片左上角的 y 坐标值
230 * @param alpha
231 * 水印透明度 0.1f ~ 1.0f
232 * @return
233 * 处理后的图片对象
234 * @throws Exception
235 */
236
237 public static BufferedImage addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha) throws Exception{
238 BufferedImage targetImage = null;
239 try {
240 Font Dfont = (font == null) ? new Font("宋体", 20, 13) : font;
241 Image img = ImageIO.read(new File(imgPath));
242 //创建目标图像文件
243 targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
244 Graphics2D g = targetImage.createGraphics();
245 g.drawImage(img, 0, 0, null);
246 g.setColor(color);
247 g.setFont(Dfont);
248 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
249 g.drawString(text, x, y);
250 g.dispose();
251 } catch (Exception e) {
252 throw new RuntimeException("添加文字水印操作异常");
253 }
254 return targetImage;
255 }
256
257
258
259 /**
260 *
261 *
262 *
263 * 压缩图片操作(文件物理存盘,使用默认格式)
264 *
265 * @param imgPath
266 * 待处理图片
267 * @param quality
268 * 图片质量(0-1之間的float值)
269 * @param width
270 * 输出图片的宽度 输入负数参数表示用原来图片宽
271 * @param height
272 * 输出图片的高度 输入负数参数表示用原来图片高
273 * @param autoSize
274 * 是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
275 * @param format
276 * 压缩后存储的格式
277 * @param destPath
278 * 文件存放路径
279 *
280 * @throws Exception
281 */
282 public static void compressImage(String imgPath,float quality,int width, int height, boolean autoSize,String destPath)throws Exception{
283 try {
284 BufferedImage bufferedImage = compressImage(imgPath, quality, width, height, autoSize);
285 ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
286 } catch (Exception e) {
287 throw new RuntimeException("图片压缩异常");
288 }
289
290 }
291
292
293 /**
294 *
295 * 压缩图片操作(文件物理存盘,可自定义格式)
296 *
297 * @param imgPath
298 * 待处理图片
299 * @param quality
300 * 图片质量(0-1之間的float值)
301 * @param width
302 * 输出图片的宽度 输入负数参数表示用原来图片宽
303 * @param height
304 * 输出图片的高度 输入负数参数表示用原来图片高
305 * @param autoSize
306 * 是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
307 * @param format
308 * 压缩后存储的格式
309 * @param destPath
310 * 文件存放路径
311 *
312 * @throws Exception
313 */
314 public static void compressImage(String imgPath,float quality,int width, int height, boolean autoSize,String format,String destPath)throws Exception{
315 try {
316 BufferedImage bufferedImage = compressImage(imgPath, quality, width, height, autoSize);
317 ImageIO.write(bufferedImage, format, new File(destPath));
318 } catch (Exception e) {
319 throw new RuntimeException("图片压缩异常");
320 }
321 }
322
323
324 /**
325 *
326 * 压缩图片操作,返回BufferedImage对象
327 *
328 * @param imgPath
329 * 待处理图片
330 * @param quality
331 * 图片质量(0-1之間的float值)
332 * @param width
333 * 输出图片的宽度 输入负数参数表示用原来图片宽
334 * @param height
335 * 输出图片的高度 输入负数参数表示用原来图片高
336 * @param autoSize
337 * 是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
338 * @return
339 * 处理后的图片对象
340 * @throws Exception
341 */
342 public static BufferedImage compressImage(String imgPath,float quality,int width, int height, boolean autoSize)throws Exception{
343 BufferedImage targetImage = null;
344 if(quality<0F||quality>1F){
345 quality = DEFAULT_QUALITY;
346 }
347 try {
348 Image img = ImageIO.read(new File(imgPath));
349 //如果用户输入的图片参数合法则按用户定义的复制,负值参数表示执行默认值
350 int newwidth =( width > 0 ) ? width : img.getWidth(null);
351 //如果用户输入的图片参数合法则按用户定义的复制,负值参数表示执行默认值
352 int newheight = ( height > 0 )? height: img.getHeight(null);
353 //如果是自适应大小则进行比例缩放
354 if(autoSize){
355 // 为等比缩放计算输出的图片宽度及高度
356 double Widthrate = ((double) img.getWidth(null)) / (double) width + 0.1;
357 double heightrate = ((double) img.getHeight(null))/ (double) height + 0.1;
358 double rate = Widthrate > heightrate ? Widthrate : heightrate;
359 newwidth = (int) (((double) img.getWidth(null)) / rate);
360 newheight = (int) (((double) img.getHeight(null)) / rate);
361 }
362 //创建目标图像文件
363 targetImage = new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
364 Graphics2D g = targetImage.createGraphics();
365 g.drawImage(img, 0, 0, newwidth, newheight, null);
366 //如果添加水印或者文字则继续下面操作,不添加的话直接返回目标文件----------------------
367 g.dispose();
368
369 } catch (Exception e) {
370 throw new RuntimeException("图片压缩操作异常");
371 }
372 return targetImage;
373 }
374
375
376
377 /**
378 * 图片黑白化操作(文件物理存盘,使用默认格式)
379 *
380 * @param bufferedImage
381 * 处理的图片对象
382 * @param destPath
383 * 目标文件地址
384 * @throws Exception
385 *
386 */
387 public static void imageGray(String imgPath, String destPath)throws Exception{
388 imageGray(imgPath, imageFormat(imgPath), destPath);
389 }
390
391
392 /**
393 * 图片黑白化操作(文件物理存盘,可自定义格式)
394 *
395 * @param bufferedImage
396 * 处理的图片对象
397 * @param format
398 * 图片格式
399 * @param destPath
400 * 目标文件地址
401 * @throws Exception
402 *
403 */
404 public static void imageGray(String imgPath,String format, String destPath)throws Exception{
405 try {
406 BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
407 ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
408 ColorConvertOp op = new ColorConvertOp(cs, null);
409 bufferedImage = op.filter(bufferedImage, null);
410 ImageIO.write(bufferedImage, format , new File(destPath));
411 } catch (Exception e) {
412 throw new RuntimeException("图片灰白化异常");
413 }
414 }
415
416
417
418 /**
419 * 图片透明化操作(文件物理存盘,使用默认格式)
420 *
421 * @param imgPath
422 * 图片路径
423 * @param destPath
424 * 图片存放路径
425 * @throws Exception
426 */
427 public static void imageLucency(String imgPath,String destPath)throws Exception{
428 try {
429 BufferedImage bufferedImage = imageLucency(imgPath);
430 ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
431 } catch (Exception e) {
432 throw new RuntimeException("图片透明化异常");
433 }
434 }
435
436
437 /**
438 * 图片透明化操作(文件物理存盘,可自定义格式)
439 *
440 * @param imgPath
441 * 图片路径
442 * @param format
443 * 图片格式
444 * @param destPath
445 * 图片存放路径
446 * @throws Exception
447 */
448 public static void imageLucency(String imgPath,String format,String destPath)throws Exception{
449 try {
450 BufferedImage bufferedImage = imageLucency(imgPath);
451 ImageIO.write(bufferedImage, format, new File(destPath));
452 } catch (Exception e) {
453 throw new RuntimeException("图片透明化异常");
454 }
455 }
456
457 /**
458 * 图片透明化操作返回BufferedImage对象
459 *
460 * @param imgPath
461 * 图片路径
462 * @return
463 * 透明化后的图片对象
464 * @throws Exception
465 */
466 public static BufferedImage imageLucency(String imgPath)throws Exception{
467 BufferedImage targetImage = null;
468 try {
469 //读取图片
470 BufferedImage img = ImageIO.read(new FileInputStream(imgPath));
471 //透明度
472 int alpha = 0;
473 //执行透明化
474 executeRGB(img, alpha);
475 targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
476 Graphics2D g = targetImage.createGraphics();
477 g.drawImage(img, 0, 0, null);
478 g.dispose();
479 } catch (Exception e) {
480 throw new RuntimeException("图片透明化执行异常");
481 }
482 return targetImage;
483 }
484
485 /**
486 * 执行透明化的核心算法
487 *
488 * @param img
489 * 图片对象
490 * @param alpha
491 * 透明度
492 * @throws Exception
493 */
494 public static void executeRGB(BufferedImage img, int alpha) throws Exception{
495 int rgb = 0;//RGB值
496 //x表示BufferedImage的x坐标,y表示BufferedImage的y坐标
497 for(int x=img.getMinX();x<img.getWidth();x++){
498 for(int y=img.getMinY();y<img.getHeight();y++){
499 //获取点位的RGB值进行比较重新设定
500 rgb = img.getRGB(x, y);
501 int R =(rgb & 0xff0000 ) >> 16 ;
502 int G= (rgb & 0xff00 ) >> 8 ;
503 int B= (rgb & 0xff );
504 if(((255-R)<30) && ((255-G)<30) && ((255-B)<30)){
505 rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
506 img.setRGB(x, y, rgb);
507 }
508 }
509 }
510 }
511
512
513 /**
514 * 图片格式转化操作(文件物理存盘)
515 *
516 * @param imgPath
517 * 原始图片存放地址
518 * @param format
519 * 待转换的格式 jpeg,gif,png,bmp等
520 * @param destPath
521 * 目标文件地址
522 * @throws Exception
523 */
524 public static void formatConvert(String imgPath, String format, String destPath)throws Exception{
525 try {
526 BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
527 ImageIO.write(bufferedImage, format, new File(destPath));
528 } catch (IOException e) {
529 throw new RuntimeException("文件格式转换出错");
530 }
531 }
532
533
534
535 /**
536 * 图片格式转化操作返回BufferedImage对象
537 *
538 * @param bufferedImage
539 * BufferedImage图片转换对象
540 * @param format
541 * 待转换的格式 jpeg,gif,png,bmp等
542 * @param destPath
543 * 目标文件地址
544 * @throws Exception
545 */
546 public static void formatConvert(BufferedImage bufferedImag, String format, String destPath)throws Exception{
547 try {
548 ImageIO.write(bufferedImag, format, new File(destPath));
549 } catch (IOException e) {
550 throw new RuntimeException("文件格式转换出错");
551 }
552 }
553
554
555 /**
556 * 获取图片文件的真实格式信息
557 *
558 * @param imgPath
559 * 图片原文件存放地址
560 * @return
561 * 图片格式
562 * @throws Exception
563 */
564 public static String imageFormat(String imgPath)throws Exception{
565 File file = new File(imgPath);
566 String format = ""; //图片格式
567 byte[] bt=new byte[(int) file.length()];
568 MemoryCacheImageInputStream mcis = new MemoryCacheImageInputStream(new ByteArrayInputStream(bt));
569 Iterator<ImageReader> it = ImageIO.getImageReaders(mcis);
570 while(it.hasNext()){
571 ImageReader imgReader = (ImageReader)it.next();
572 if(imgReader instanceof GIFImageReader){
573 format="gif";
574 }else if(imgReader instanceof JPEGImageReader){
575 format="jpeg";
576 }else if(imgReader instanceof PNGImageReader){
577 format="png";
578 }else if(imgReader instanceof BMPImageReader){
579 format="bmp";
580 }
581 }
582 return format;
583 }
584
585 }
转载请注明出处[http://www.cnblogs.com/dennisit/archive/2012/12/28/2837452.html]
热爱生活,热爱Coding,敢于挑战,用于探索 ...