下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幕墙工程招标文件案例
- 货运三轮车交易协议
- 尿素采购协议合同
- 生产车间承包技术成果成果分配
- 幼儿园应急安全措施保证
- 云计算系统服务合同
- 采购合同的分类介绍
- 招标文件与合同的衔接
- 出行安全我保障
- 采石场石块销售合约
- 2023年冬季山东高中学业水平合格考政治试题真题(含答案)
- 急救知识与技术智慧树知到期末考试答案章节答案2024年新疆巴音郭楞蒙古自治州卫生学校
- 《风电场项目经济评价规范》(NB-T 31085-2016)
- 《香包的制作》教学设计(优质课比赛教案)
- 郴州市届高三第一次教学质量监测质量分析报告(总)
- 《中国诗词大会》原题——九宫格
- 步进送料机设计终稿
- (精心整理)中国地形空白填图
- 合理用药检查表(共4页)
- 烟化炉(上海冶炼厂编)_图文
- 滑坡监测技术方案
评论
0/150
提交评论