Java图片压缩处理

过去做的项目都是针对企业级应用,第一次开发新闻版块图片上传的功能,需要解决用户上传图片后,按照用户规定的尺寸大小或者按照图片比例,对图片进行压缩。

自己试写的工具类,写的时候考虑了几个关键点:

1、图片格式

JAVA的API很好,com.sun.image.codec.jpeg.JPEGCodec和com.sun.image.codec.jpeg.JPEGImageEncoder 这两个类基本上自动解决了类型转换的问题,可以正常实现bmp转jpg、png转jpg、gif转jpg但是暂时还没有解决gif转gif的功能。

2、画面质量的问题

BufferedImage tag = new BufferedImage((int)newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);

// Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢

tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);

3、压缩速度

测试36MB的bmp图片(8192*6144)压缩成(160*120)的jpg的5KB图片,只需要2-3秒的时间。批量处理100张(1027*768)的bmp图像,转换成(120*80)的jpg图片总共只需要17秒。

4、根据用户喜好选择压缩模式

按比例或者按规定尺寸

//compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))

以下是源码,如觉得可以更加完善的话,希望大家可以提供点意见!

Java代码 收藏代码
  1. /**
  2. *缩略图实现,将图片(jpg、bmp、png、gif等等)真实的变成想要的大小
  3. */
  4. packagecom.joewalker.test;
  5. importjava.awt.Image;
  6. importjava.awt.image.BufferedImage;
  7. importjava.io.File;
  8. importjava.io.FileOutputStream;
  9. importjava.io.IOException;
  10. importjavax.imageio.ImageIO;
  11. importcom.sun.image.codec.jpeg.JPEGCodec;
  12. importcom.sun.image.codec.jpeg.JPEGImageEncoder;
  13. /*******************************************************************************
  14. *缩略图类(通用)本java类能将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换。具体使用方法
  15. *compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
  16. */
  17. publicclassCompressPicDemo{
  18. privateFilefile=null;//文件对象
  19. privateStringinputDir;//输入图路径
  20. privateStringoutputDir;//输出图路径
  21. privateStringinputFileName;//输入图文件名
  22. privateStringoutputFileName;//输出图文件名
  23. privateintoutputWidth=100;//默认输出图片宽
  24. privateintoutputHeight=100;//默认输出图片高
  25. privatebooleanproportion=true;//是否等比缩放标记(默认为等比缩放)
  26. publicCompressPicDemo(){//初始化变量
  27. inputDir="";
  28. outputDir="";
  29. inputFileName="";
  30. outputFileName="";
  31. outputWidth=100;
  32. outputHeight=100;
  33. }
  34. publicvoidsetInputDir(StringinputDir){
  35. this.inputDir=inputDir;
  36. }
  37. publicvoidsetOutputDir(StringoutputDir){
  38. this.outputDir=outputDir;
  39. }
  40. publicvoidsetInputFileName(StringinputFileName){
  41. this.inputFileName=inputFileName;
  42. }
  43. publicvoidsetOutputFileName(StringoutputFileName){
  44. this.outputFileName=outputFileName;
  45. }
  46. publicvoidsetOutputWidth(intoutputWidth){
  47. this.outputWidth=outputWidth;
  48. }
  49. publicvoidsetOutputHeight(intoutputHeight){
  50. this.outputHeight=outputHeight;
  51. }
  52. publicvoidsetWidthAndHeight(intwidth,intheight){
  53. this.outputWidth=width;
  54. this.outputHeight=height;
  55. }
  56. /*
  57. *获得图片大小
  58. *传入参数Stringpath:图片路径
  59. */
  60. publiclonggetPicSize(Stringpath){
  61. file=newFile(path);
  62. returnfile.length();
  63. }
  64. //图片处理
  65. publicStringcompressPic(){
  66. try{
  67. //获得源文件
  68. file=newFile(inputDir+inputFileName);
  69. if(!file.exists()){
  70. return"";
  71. }
  72. Imageimg=ImageIO.read(file);
  73. //判断图片格式是否正确
  74. if(img.getWidth(null)==-1){
  75. System.out.println("can'tread,retry!"+"<BR>");
  76. return"no";
  77. }else{
  78. intnewWidth;intnewHeight;
  79. //判断是否是等比缩放
  80. if(this.proportion==true){
  81. //为等比缩放计算输出的图片宽度及高度
  82. doublerate1=((double)img.getWidth(null))/(double)outputWidth+0.1;
  83. doublerate2=((double)img.getHeight(null))/(double)outputHeight+0.1;
  84. //根据缩放比率大的进行缩放控制
  85. doublerate=rate1>rate2?rate1:rate2;
  86. newWidth=(int)(((double)img.getWidth(null))/rate);
  87. newHeight=(int)(((double)img.getHeight(null))/rate);
  88. }else{
  89. newWidth=outputWidth;//输出的图片宽度
  90. newHeight=outputHeight;//输出的图片高度
  91. }
  92. BufferedImagetag=newBufferedImage((int)newWidth,(int)newHeight,BufferedImage.TYPE_INT_RGB);
  93. /*
  94. *Image.SCALE_SMOOTH的缩略算法生成缩略图片的平滑度的
  95. *优先级比速度高生成的图片质量比较好但速度慢
  96. */
  97. tag.getGraphics().drawImage(img.getScaledInstance(newWidth,newHeight,Image.SCALE_SMOOTH),0,0,null);
  98. FileOutputStreamout=newFileOutputStream(outputDir+outputFileName);
  99. //JPEGImageEncoder可适用于其他图片类型的转换
  100. JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out);
  101. encoder.encode(tag);
  102. out.close();
  103. }
  104. }catch(IOExceptionex){
  105. ex.printStackTrace();
  106. }
  107. return"ok";
  108. }
  109. publicStringcompressPic(StringinputDir,StringoutputDir,StringinputFileName,StringoutputFileName){
  110. //输入图路径
  111. this.inputDir=inputDir;
  112. //输出图路径
  113. this.outputDir=outputDir;
  114. //输入图文件名
  115. this.inputFileName=inputFileName;
  116. //输出图文件名
  117. this.outputFileName=outputFileName;
  118. returncompressPic();
  119. }
  120. publicStringcompressPic(StringinputDir,StringoutputDir,StringinputFileName,StringoutputFileName,intwidth,intheight,booleangp){
  121. //输入图路径
  122. this.inputDir=inputDir;
  123. //输出图路径
  124. this.outputDir=outputDir;
  125. //输入图文件名
  126. this.inputFileName=inputFileName;
  127. //输出图文件名
  128. this.outputFileName=outputFileName;
  129. //设置图片长宽
  130. setWidthAndHeight(width,height);
  131. //是否是等比缩放标记
  132. this.proportion=gp;
  133. returncompressPic();
  134. }
  135. //main测试
  136. //compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
  137. publicstaticvoidmain(String[]arg){
  138. CompressPicDemomypic=newCompressPicDemo();
  139. System.out.println("输入的图片大小:"+mypic.getPicSize("e:\\1.jpg")/1024+"KB");
  140. intcount=0;//记录全部图片压缩所用时间
  141. for(inti=0;i<100;i++){
  142. intstart=(int)System.currentTimeMillis();//开始时间
  143. mypic.compressPic("e:\\","e:\\test\\","1.jpg","r1"+i+".jpg",120,120,true);
  144. intend=(int)System.currentTimeMillis();//结束时间
  145. intre=end-start;//但图片生成处理时间
  146. count+=re;System.out.println("第"+(i+1)+"张图片压缩处理使用了:"+re+"毫秒");
  147. System.out.println("输出的图片大小:"+mypic.getPicSize("e:\\test\\r1"+i+".jpg")/1024+"KB");
  148. }
  149. System.out.println("总共用了:"+count+"毫秒");
  150. }
  151. }


你可能感兴趣的:(java)