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);
Iteratoriter=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
publicListdispose(){
src=super.dispose();
returnpress();
}
/**加水印-具体装饰方法*/
privateListpress(){
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
publicListdispose(){
src=super.dispose();
returnresize();
}
/**缩放-具体装饰方法*/
privateListresize(){
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();
}
/**复制-被装饰者初始状态*/
privateListcopy(){
if(src==null||"".equals(src)||target==null||"".equals(target)){
thrownewRuntimeException("源路径或目标路径不能为空");
}
FilesrcFile=newFile(src);
Listlist=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程序设计有所帮助。