数字水印分为可见和不可见,比如课件上印的学校标志,微博上发的图片水印上的上传者信息和微博标志。用java实现可见数字水印,曹仁主要使用了java.awt包中的AlphaComposite类。当然,在实现之前先介绍一下AlphaComposite类:AlphaComposite类是一个关于两个重叠目标的混合处理类。具体规则是T.Porter和T.Duff着的“CompositingDigitalImages”中描述的12条基本规则集,SIGGRAPH84,253-259。这个类提供了一个getInstance方法,它的两个参数是rule和alpha,第二个参数会被调用者设置一个alpha值,也就是透明度设置,第一个参数是混合方法。此类扩展了Porter和Duff定义的方程式以包含一个附加因子。AlphaComposite类的实例可以包含一个alpha值,该值可用于在每个源像素用于混合方程之前修改其不透明度和覆盖范围。Porter和Duff的论文在混合方程的描述中使用了以下因素:视觉效果。在指定视觉效果的12个静态字段的描述中,给出了确定Fs和Fd值的方程式。SRC_OVER将源颜色合成到目标颜色之上(Porter-DuffSourceOverDestination规则)。指定Fs=1,Fd=(1-As),所以:Ar=As+Ad*(1-As)Cr=Cs+Cd*(1-As)该类扩展后共有24条规则,且定义了9个由于曹仁的程序中使用了方法getInstance(),下面来解释一下——详细定义:publicstaticAlphaCompositegetInstance(intrule,floatalpha)功能:创建一个AlphaComposite对象,指定规则和常量alpha值相乘源颜色的alpha值。在与目标颜色合成之前,源颜色乘以指定的alpha值。?参数:rule——复合规则,24种;alpha-将与源颜色的alpha值相乘的常量alpha值。alpha必须是[0.0,1.0](含)范围内的浮点数。?抛出:IllegalArgumentException-如果alpha小于0.0或大于1.0,或者规则是以下规则之一:CLEAR、SRC、DST、SRC_OVER、DST_OVER、SRC_IN、DST_IN、SRC_OUT、DST_OUT、SRC_ATOP、DST_ATOP或XOR。更详细推荐AlphaCompositehttp类文档:http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/awt/AlphaComposite.html#hashCode(),CompositingDigitalImages论文:https://en.wikipedia.org/wiki/Alpha_compositing既然是图像处理,首先创建一个java2d对象Graphics2Dg2d=image.createGraphics();//用源图像填充背景g2d.drawImage(image,0,0,image.getWidth(),image.getHeight(),null,null);然后为Graphics2D上下文设置Composite后,就可以在源图上写上你想写的文字或图片了AlphaCompositeac=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha);//为Graphics2D上下文设置Composite。Composite用于所有绘图方法,如drawImage、//drawString、draw和fill。它指定在渲染过程中新像素如何与图形设备上的现有像素相结合。g2d.setComposite(ac);完整代码(代码注释够多,不再赘述)packagecumt.zry.two;importjava.awt.*;importjava.awt.image.BufferedImage;importjava.io.*;importjavax.imageio.*;publicclassWatermark2{publicWatermark2(){super();};/***在源图像上设置水印文本*/publicvoidWordsToImage(StringsrcImagePath,floatalpha,Stringfont,intfontStyle,intfontSize,Colorcolor,StringinputWords,intx,inty,StringimageFormat,StringtoPath)throwsIOException{FileOutputStreamfos=null;try{//读取图片BufferedImageimage=ImageIO.read(newFile(srcImagePath));//创建java2D对象Graphics2Dg2d=image.createGraphics();//用源图填充背景g2d.drawImage(image,0,0,image.getWidth(),image.getHeight(),null,null);//!!!!AlphaCompositeac=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha);//为Graphics2D上下文设置Composite。Composite用于所有绘图方法,如drawImage、//drawString、draw和fill。它指定在渲染过程中新像素如何与图形设备上的现有像素相结合。g2d.setComposite(ac);//设置文字字体名称、样式、大小g2d.setFont(newFont(font,fontStyle,fontSize));g2d.setColor(color);//设置字体颜色g2d.drawString(inputWords,x,y);//输入水印文本及其起始x、y坐标g2d.dispose();//将水印图像写入toPath路径fos=newFileOutputStream(toPath);ImageIO.write(image,imageFormat,fos);}//文件操作错误抛出catch(Exceptione){e.printStackTrace();}finally{if(fos!=null){fos.close();}}}/***onsourceimageSetimagewatermark*/publicvoidImageToImage(StringsrcImagePath,StringappendImagePath,floatalpha,intx,inty,intwidth,inheight,StringimageFormat,StringtoPath)throwsIOException{FileOutputStreamfos=null;try{//读取图像BufferedImageimage=ImageIO.read(newFile(srcImagePath));//创建一个java2DobjectGraphics2Dg2d=image.createGraphics();//用源图填充背景g2d.drawImage(image,0,0,image.getWidth(),image.getHeight(),null,null);//关键地方AlphaCompositeac=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,alpha);g2d.setComposite(ac);BufferedImageappendImage=ImageIO.read(newFile(appendImagePath));g2d.drawImage(appendImage,x,y,width,height,null,null);g2d。dispose();fos=newFileOutputStream(toPath);ImageIO.write(image,imageFormat,fos);}catch(Exceptione){e.printStackTrace();}finally{if(fos!=null){fos.close();}}}publicstaticvoidmain(String[]args)throwsException{Watermark2imageObj=newWatermark2();//源图路径StringsrcImagePath="F:/27.jpg";//水印图路径StringappendImagePath="F:/logo.jpg";//----宋体普通字体77红色透明度0.4"floatalpha=0.4F;Stringfont="宋体";intfontStyle=Font.PLAIN;intfontSize=77;Colorcolor=Color.RED;StringinputWords="seton图片Watermarktext";intx=1700;inty=77;StringimageFormat="jpg";//水印文字后的存放路径StringwToPath="F:/31.png";//水印图片后的存放路径StringIToPath="F:/7.png";imageObj.WordsToImage(srcImagePath,alpha,font,fontStyle,fontSize,color,inputWords,x,y,imageFormat,wToPath);imageObj.ImageToImage(srcImagePath,appendImagePath,alpha,x,y,300,200,imageFormat,IToPath);}}实施预览:
