Java基于装饰者模式实现的图片工具类实例【附demo源码下载】
本文实例讲述了Java基于装饰者模式实现的图片工具类。分享给大家供大家参考,具体如下:
ImgUtil.java:
/* *装饰者模式实现图片处理工具类 *类似java的io流- *Img类似低级流可以独立使用 *Press和Resize类似高级流 *需要依赖于低级流 */ packageutil; importjava.io.File; importjava.util.List; /** *图片工具类(装饰者)和图片(被装饰者)的公共接口 *@authorxlk */ publicinterfaceImgUtil{ /**装饰方法-处理图片*/ Listdispose(); }
AbstractImgUtil.java:
packageutil; importjava.io.File; importjava.io.IOException; importjava.util.Iterator; importjava.util.List; importjavax.imageio.ImageIO; importjavax.imageio.ImageReader; importjavax.imageio.stream.ImageInputStream; /** *抽象图片工具类-抽象装饰者 *@authorxlk */ publicabstractclassAbstractImgUtilimplementsImgUtil{ privateImgUtilimgUtil; @Override publicListdispose(){ returnimgUtil.dispose(); } publicAbstractImgUtil(){} publicAbstractImgUtil(ImgUtilimgUtil){ this.imgUtil=imgUtil; } /** *判断文件是不是图片 *@paramfile被判断的文件 *@return图片返回true非图片返回false *@throwsIOException */ publicstaticbooleanisImg(Filefile){ if(file.isDirectory()){ returnfalse; } try{ ImageInputStreamiis=ImageIO.createImageInputStream(file); Iterator iter=ImageIO.getImageReaders(iis); if(!iter.hasNext()){//文件不是图片 returnfalse; } returntrue; }catch(IOExceptione){ returnfalse; } } }
Press.java:
packageutil; importjava.awt.AlphaComposite; importjava.awt.Graphics2D; importjava.awt.Image; importjava.awt.image.BufferedImage; importjava.io.File; importjava.io.IOException; importjava.util.List; importjavax.imageio.ImageIO; /** *加水印-装饰者 *@authorxlk */ publicclassPressextendsAbstractImgUtil{ privateListsrc;//图片路径集合 privateStringwaterImg;//水印图片路径 privateIntegerx;//水印图片距离目标图片左侧的偏移量,如果x<0,则在正中间 privateIntegery;//水印图片距离目标图片上侧的偏移量,如果y<0,则在正中间 privatefloatalpha;//水印透明度(0.0--1.0,0.0为完全透明,1.0为完全不透明) @Override publicList dispose(){ src=super.dispose(); returnpress(); } /**加水印-具体装饰方法*/ privateList press(){ if(waterImg==null||"".equals(waterImg)){ thrownewRuntimeException("水印路径不能为空"); } if(!isImg(newFile(waterImg))){ thrownewRuntimeException("水印路径所指向的文件不是图片"); } if(src.size()<=0){ returnsrc; } if(x!=null&&y!=null){ for(Filef:src){ press(f.getPath(),waterImg,f.getParent(),x,y,alpha); } }else{ for(Filef:src){ press(f.getPath(),waterImg,f.getParent(),alpha); } } returnsrc; } publicPress(){} publicPress(ImgUtilimgUtil,StringwaterImg,floatalpha){ super(imgUtil); this.waterImg=waterImg; this.alpha=alpha; } publicPress(ImgUtilimgUtil,StringwaterImg,Integerx,Integery,floatalpha){ super(imgUtil); this.waterImg=waterImg; this.x=x; this.y=y; this.alpha=alpha; } publicStringgetWaterImg(){ returnwaterImg; } publicvoidsetWaterImg(StringwaterImg){ this.waterImg=waterImg; } publicIntegergetX(){ returnx; } publicvoidsetX(Integerx){ this.x=x; } publicIntegergetY(){ returny; } publicvoidsetY(Integery){ this.y=y; } publicfloatgetAlpha(){ returnalpha; } publicvoidsetAlpha(floatalpha){ this.alpha=alpha; } /**添加图片水印*/ privatestaticvoidpress(Stringsrc,StringwaterImg,Stringtarget,intx,inty,floatalpha){ FilenewFile=null; try{ Filefile=newFile(src); Imageimage=ImageIO.read(file); intwidth=image.getWidth(null); intheight=image.getHeight(null); BufferedImagebufferedImage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics2Dg=bufferedImage.createGraphics(); g.drawImage(image,0,0,width,height,null); ImagewaterImage=ImageIO.read(newFile(waterImg));//水印文件 intwidth_1=waterImage.getWidth(null); intheight_1=waterImage.getHeight(null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha)); intwidthDiff=width-width_1; intheightDiff=height-height_1; if(x<0){ x=widthDiff/2; }elseif(x>widthDiff){ x=widthDiff; } if(y<0){ y=heightDiff/2; }elseif(y>heightDiff){ y=heightDiff; } g.drawImage(waterImage,x,y,width_1,height_1,null);//水印文件结束 g.dispose(); Filedir=newFile(target); if(!dir.exists()){ dir.mkdirs(); } newFile=newFile(target+File.separator+file.getName()); ImageIO.write(bufferedImage,"jpg",newFile); }catch(IOExceptione){ e.printStackTrace(); } } /**平铺添加图片水印*/ privatestaticvoidpress(Stringsrc,StringwaterImg,Stringtarget,floatalpha){ FilenewFile=null; try{ Filefile=newFile(src); Imageimage=ImageIO.read(file); intwidth=image.getWidth(null); intheight=image.getHeight(null); BufferedImagebufferedImage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics2Dg=bufferedImage.createGraphics(); g.drawImage(image,0,0,width,height,null); ImagewaterImage=ImageIO.read(newFile(waterImg));//水印文件 intwidth_1=waterImage.getWidth(null); intheight_1=waterImage.getHeight(null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha)); intrpt_x=width>width_1?(int)Math.ceil(Double.valueOf(width)/width_1):1;//x方向重复次数 intrpt_y=height>height_1?(int)Math.ceil(Double.valueOf(height)/height_1):1;//y方向重复次数 for(inti=0;i Resize.java:
packageutil; importjava.awt.Color; importjava.awt.Graphics2D; importjava.awt.Image; importjava.awt.geom.AffineTransform; importjava.awt.image.AffineTransformOp; importjava.awt.image.BufferedImage; importjava.io.File; importjava.io.IOException; importjava.util.List; importjavax.imageio.ImageIO; /** *缩放-装饰者 *@authorxlk */ publicclassResizeextendsAbstractImgUtil{ /**比例不同边界颜色*/ privatestaticfinalColorcolor=newColor(230,230,230); privateListsrc;//图片路径集合 privateintheight;//处理后高度 privateintwidth;//处理后宽度 privatedoubleratio;//处理后高宽比 privatebooleanbb;//比例不对时是否补白 @Override publicList dispose(){ src=super.dispose(); returnresize(); } /**缩放-具体装饰方法*/ privateList resize(){ if(src.size()<=0){ returnsrc; } if(ratio>0){ for(Filef:src){ resize(f.getPath(),f.getParent(),ratio,bb); } }elseif(height>0&&width>0){ for(Filef:src){ resize(f.getPath(),f.getParent(),height,width,bb); } } returnsrc; } publicResize(){} publicResize(ImgUtilimgUtil,intheight,intwidth,booleanbb){ super(imgUtil); this.height=height; this.width=width; this.bb=bb; } publicResize(ImgUtilimgUtil,doubleratio,booleanbb){ super(imgUtil); this.ratio=ratio; this.bb=bb; } publicintgetHeight(){ returnheight; } publicvoidsetHeight(intheight){ this.height=height; } publicintgetWidth(){ returnwidth; } publicvoidsetWidth(intwidth){ this.width=width; } publicdoublegetRatio(){ returnratio; } publicvoidsetRatio(doubleratio){ this.ratio=ratio; } publicbooleanisBb(){ returnbb; } publicvoidsetBb(booleanbb){ this.bb=bb; } /**图片缩放-按照尺寸*/ privatestaticvoidresize(Stringsrc,Stringtarget,intheight,intwidth,booleanbb){ FilenewFile=null; try{ doubleratio=0;//缩放比例 Filef=newFile(src); BufferedImagebi=ImageIO.read(f); Imageitemp=bi.getScaledInstance(width,height,BufferedImage.SCALE_SMOOTH); //计算比例 if(Double.valueOf(bi.getHeight())/bi.getWidth()>Double.valueOf(height)/width){ ratio=Double.valueOf(height)/bi.getHeight(); }else{ ratio=Double.valueOf(width)/bi.getWidth(); } AffineTransformOpop=newAffineTransformOp(AffineTransform.getScaleInstance(ratio,ratio),null); itemp=op.filter(bi,null); if(bb){ BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics2Dg=image.createGraphics(); g.setColor(color); g.fillRect(0,0,width,height); if(width==itemp.getWidth(null)) g.drawImage(itemp,0,(height-itemp.getHeight(null))/2,itemp.getWidth(null),itemp.getHeight(null),color,null); else g.drawImage(itemp,(width-itemp.getWidth(null))/2,0,itemp.getWidth(null),itemp.getHeight(null),color,null); g.dispose(); itemp=image; } Filedir=newFile(target); if(!dir.exists()){ dir.mkdirs(); } newFile=newFile(target+File.separator+f.getName()); ImageIO.write((BufferedImage)itemp,"jpg",newFile); }catch(IOExceptione){ e.printStackTrace(); } } /**图片缩放-按照高宽比*/ privatestaticvoidresize(Stringsrc,Stringtarget,doubleratio,booleanbb){ FilenewFile=null; try{ Filef=newFile(src); BufferedImagebi=ImageIO.read(f); //计算尺寸 intwidth=bi.getWidth(); intheight=bi.getHeight(); if(Double.valueOf(height)/width Img.java:
packageutil; importjava.io.File; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.IOException; importjava.util.ArrayList; importjava.util.List; /** *图片-原组件 *@authorxlk */ publicclassImgimplementsImgUtil{ privateStringsrc;//源图片或图片文件夹路径 privateStringtarget;//目标文件夹路径 privatebooleaninner;//true-包含子文件夹,false-仅当前文件夹 @Override publicListdispose(){ returncopy(); } /**复制-被装饰者初始状态*/ privateList copy(){ if(src==null||"".equals(src)||target==null||"".equals(target)){ thrownewRuntimeException("源路径或目标路径不能为空"); } FilesrcFile=newFile(src); List list=newArrayList (); FiletargetDir=newFile(target); if(!targetDir.exists()){ targetDir.mkdirs(); } a: if(srcFile.isDirectory()){//源路径是文件夹 File[]subs=srcFile.listFiles(); if(subs.length<=0){ breaka; } for(Filesub:subs){ if(sub.isDirectory()&&inner){ list.addAll(newImg(sub.getPath(),target+File.separator+sub.getName(),true).copy()); }elseif(AbstractImgUtil.isImg(sub)){ list.add(copy(sub,target)); } } }elseif(AbstractImgUtil.isImg(srcFile)){//源路径是图片 list.add(copy(srcFile,target)); } returnlist; } privateFilecopy(Filefile,Stringtarget){ FileInputStreamfis=null; FileOutputStreamfos=null; FilenewFile=null; try{ fis=newFileInputStream(file); newFile=newFile(target+File.separator+file.getName()); fos=newFileOutputStream(newFile); byte[]bs=newbyte[1024*10]; intlen=-1; while((len=fis.read(bs))!=-1){ fos.write(bs,0,len); } }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(fis!=null){ fis.close(); } if(fos!=null){ fos.close(); } }catch(IOExceptione){ e.printStackTrace(); } } returnnewFile; } publicImg(){} publicImg(Stringsrc,Stringtarget){ this.src=src; this.target=target; } publicImg(Stringsrc,Stringtarget,booleaninner){ this.src=src; this.target=target; this.inner=inner; } publicStringgetSrc(){ returnsrc; } publicvoidsetSrc(Stringsrc){ this.src=src; } publicStringgetTarget(){ returntarget; } publicvoidsetTarget(Stringtarget){ this.target=target; } publicbooleanisInner(){ returninner; } publicvoidsetInner(booleaninner){ this.inner=inner; } } 附:完整实例代码点击此处本站下载。
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。