java图片处理解决方案_第1页
java图片处理解决方案_第2页
java图片处理解决方案_第3页
java图片处理解决方案_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java图⽚处理解决⽅案项⽬需要调整图⽚服务器的解决⽅案,这次调整使⽤fastdfs存储⼩⽂件,也就是图⽚,因为现在还没有fastdfs的.net版的客服端,所以理所当然把处理图⽚放到了java这块,使⽤java来处理图⽚并且上传到fastdfs上。之前还真没⽤java整过图⽚,因为⼀般没这个需求,现在的需求是要根据前台传过来的尺⼨进⾏图⽚的缩略,⾃适应缩放,留⽩,加⽔印操作。⼀开始我使⽤jdk⾃带的⼀套图⽚处理库来处理图⽚,也就是sun的JPEGCodec,测试发现它会把所有的图⽚全部转换成jpeg格式,也就是说把bmp,gif,png这种格式的图⽚全部转换成了jpeg格式,⽽且对于gif动画图⽚缩放就只能对第⼀帧缩放,所以对于gif这种的的缩放完之后就“不动了”。之后使⽤Graphics2D+ImageIO的⽅式,先判断图⽚的格式,然后缩放的时候强制的把图⽚格式作为参数传给ImageIO来处理,ImageIO.write(image,pic_type,out);但是对于gif动画图⽚缩放也只对第⼀帧缩放,所以对于gif这种的的缩放完之后也是“不动了”。最后在⽹上发现了⼀个架包--gif4j,它可以对gif动画图⽚进⾏缩放但是对于加⽔印和留⽩操作就⽆能为⼒了。最后在做压⼒测试时发现,使⽤这种⽅式(java的jdk+gif4j),特别是对于⼤图的操作,⼤图我这边测试的是6~7M的图⽚,发现⾮常⾮常耗cpu和内存,当然程序已经优化过的前提下测试,图⽚都以流的⽅式进⾏操作。但是这种cpu和内存的消耗简直是开玩笑了,要是需要处理的图⽚⼀多,每秒过百的请求服务器就得卡死,⽽且这种⽅式处理的图⽚质量不是特别⾼。在这种⽅案放弃之后,发现了ImageMagick。ImageMagick(TM)是⼀个免费的创建、编辑、合成图⽚的软件。它可以读取、转换、写⼊多种格式的图⽚。图⽚切割、颜⾊替换、各种效果的应⽤,图⽚的旋转、组利⽤Java的JNI(java本地调⽤),依赖操作系统提供的功能,操作批量、⼤图⽚,这种⽅式效率⽐较⾼。然后当然是开搞,ImageMagick在windows和linux下的配置稍有不同,详细情况可以参考:/script/index.php下⾯贴出使⽤JMagick调⽤Imagemagick进⾏缩略的代码。publicvoidresize1(Stringsrc,Stringdsec,intwidth,intheight,intquality){ImageInfoinfo=null;MagickImageimage=null;DimensionimageDim=null;MagickImagescaled=null;try{info=newImageInfo(src);info.setQuality(quality);image=newMagickImage(info);imageDim=image.getDimension();intsrcW=imageDim.width;intsrcH=imageDim.height;int[]i=PicUtil.getWandH(srcW,srcH,width,height,1);scaled=image.scaleImage(i[0],i[1]);scaled.setFileName(dsec);scaled.writeImage(info);}catch(Exceptione){e.printStackTrace();}finally{if(scaled!=null){scaled.destroyImages();}if(image!=null){image.destroyImages();}}}这⾥注意,使⽤完之后要释放资源。if(scaled!=null){scaled.destroyImages();}if(image!=null){image.destroyImages();}否则会很伤,你懂的。加⽔印代码:publicvoidaddWater(Stringsrc,Stringsrc_biao,Stringdsrc,intposition,intquality){ImageInfoinfo=null;ImageInfologo_info=null;MagickImageimage=null;MagickImagelogo_image=null;DimensionimageDim=null;Dimensionlogo_imageDim=null;//MagickImagecompositeimage=null;try{info=newImageInfo(src);info.setQuality(quality);image=newMagickImage(info);imageDim=image.getDimension();logo_info=newImageInfo(src_biao);logo_image=newMagickImage(logo_info);logo_imageDim=logo_image.getDimension();int[]ii=WaterPosition.position(position,imageDim.width,logo_imageDim.width,imageDim.height,logo_imageDim.height);positeImage(CompositeOperator.AtopCompositeOp,logo_image,ii[0],ii[1]);image.setFileName(dsrc);image.writeImage(info);}catch(Exceptione){e.printStackTrace();}finally{if(logo_image!=null){logo_image.destroyImages();}if(image!=null){image.destroyImages();}}}代码都整完之后,进⾏压⼒测试,问题出来了,java调⽤JNI的⽅式存在内存隐患,⾄于原因,可以⽹上查查。现在的情况就是如果可以10天半个⽉重启下服务,那没问题,但是如果长时间的跑着服务,它会把内存耗尽,然后死掉。很郁闷,是吧,我也很郁闷。但我想做就做个NB点的吧,然后发现了GraphicsMagick+im4java这种⽅式。具体的不介绍了,⽹上资料很少,例⼦代码更少,我在这⾥贴⼏段,仅供参考。缩放代码:publicvoidresize1(Stringsrc,Stringdsec,into_width,into_heigh,intwidth,intheight,doublequality){int[]i=PicUtil.getWandH(o_width,o_heigh,width,height,1);ConvertCmdcmd=newConvertCmd(true);IMOperationop=newIMOperation();op.addImage(src);op.scale(i[0],i[1]);op.quality(quality);op.addImage(dsec);try{cmd.run(op);}catch(Exceptione){log.error(e,e);}}加⽔印:publicvoidaddWater(Stringsrc,Stringsrc_biao,Stringdsrc,intposition,doublequality){CompositeCmdcmd=newCompositeCmd(true);IMOperationop=newIMOperation();op.gravity(WaterPosit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论