图像水印算法源代码
Java实现图片加水印且控制位置和透明度

Java实现图片加水印且控制位置和透明度昨天要做一个给图片加水印的功能,不想使用一些插件,就在网上转了一会儿,经过改装成了我需要的功能,代码如下:package org.guhao;importjava.awt.AlphaCo mposit e;importjava.awt.Graphic s2D;importjava.awt.Image;importjava.awt.image.Buffere dImage;importjava.io.File;importjava.text.SimpleD ateFor mat;importjava.util.Date;importjavax.imageio.ImageIO;publicclass TestWat ermark {/*** 图片水印* @param pressim g 水印图片* @param targeti mg 目标图片* @param locatio n 位置:1、左上角,2、右上角,3、左下角,4、右下角,5、正中间* @param alpha 透明度*/publicstaticvoid pressIm age(Stringpressim g, Stringtargeti mg, int locatio n, float alpha) {try {//读取目标图片File img = new File(targeti mg);Image src = ImageIO.read(img);int width = src.getWidt h(null);int height= src.getHeig ht(null);Buffere dImage image = new Buffere dImage(width, height,Buffere dImage.TYPE_IN T_RGB);Graphic s2D g = image.createG raphic s();g.drawIma ge(src, 0, 0, width, height, null);//水印文件Image src_bia o = ImageIO.read(new File(pressim g));int width_b iao = src_bia o.getWidt h(null);int height_biao = src_bia o.getHeig ht(null);//如果水印图片高或者宽大于目标图片是做的处理,使其水印宽或高等于目标图片的宽高,并且等比例缩放int new_wid th_bia o = width_b iao;int new_hei ght_bi ao = height_biao;if(width_b iao > width){new_wid th_bia o = width;new_hei ght_bi ao = (int) ((double)new_wid th_bia o/width_b iao*height); }if(new_hei ght_bi ao > height){new_hei ght_bi ao = height;new_wid th_bia o = (int)((double)new_hei ght_bi ao/height_biao*new_wid th_bia o);}//根据位置参数确定坐标位置int x = 0;int y = 0;switch(locatio n){case 1:break;case 2:x = width – new_wid th_bia o;break;case 3:y = height– new_hei ght_bi ao;break;case 4:x = width – new_wid th_bia o;y = height– new_hei ght_bi ao;break;case 5:x = (width – new_wid th_bia o)/2;y = (height– new_hei ght_bi ao)/2;break;default:break;}g.setComp osite(AlphaCo mposit e.getInst ance(AlphaCo mposit e.SRC_ATO P, alpha));g.drawIma ge(src_bia o, x, y, new_wid th_bia o, new_hei ght_bi ao, null);//水印文件结束g.dispose();ImageIO.write( image, “png”, img);} catch (Excepti on e) {e.printSt ackTra ce();}}}这个功能我用1000张图片做测试的,平均0.1秒左右操作一张图片,本地测的,如果是服务器的话相信会很快的,但是这个还有一个bug,就是给背景透明的png图片加水印会使背景变黑,这大概是重新d rawIma ge的时候改变了图片的一些属性,如果那个朋友解决了这个问题记得告诉我一下(1211452*********),不胜感激(这个bug我们没有花太多时间去解决,主要原因是在生产环境中,一般不会有客户去给一张透明背景的图片加水印,除非有特殊需求,那他们会使用p s之类的搞的,呵呵)!。
水印代码

clear all;%logistic序列生成算法figure(1);an=linspace(3.1,3.99,400);hold on;box on;axis([min(an),max(an),-1,2]);N=64*64;xn=zeros(1,N);for a=an;x=rand;for k=1:20;x=a*x*(1-x);endfor k=1:N;x=a*x*(1-x);xn(k)=x;b(k,1)=x;endplot(a*ones(1,N),xn,'k.','markersize',1);endc=reshape(b,64,64);%二维矩阵调制for a1=1:64;for a2=1:64;if c(a1,a2)>=0.5;d(a1,a2)=1;else d(a1,a2)=0;end;end;end%水印加密e=imread('c:\new\123.BMP');e=double(e);f=bitxor(d,e);%mm=imread('c:\new\0.BMP');nn=double(mm);%h=bitxor(d,mm); g=bitxor(d,f);figure(2);subplot(2,2,1);imshow(d);title('混沌序列矩阵');subplot(2,2,2);imshow(e);title('水印图像');subplot(2,2,3);imshow(f);title('混沌加密水印图像');imwrite(f,'c:\new\0.BMP');subplot(2,2,4);imshow(g);title('水印图像恢复');M=256;N=64;[filename1,pathname]=uigetfile('*.*','select the image');image1=imread(num2str(filename1));figure(3);subplot(2,2,1);imshow(image1);title('original image');image1=double(image1);subplot(2,2,2);imshow(f);title('original watermark');%嵌入水印[ca,ch,cv,cd] = dwt2(image1,'db1');[cas,chs,cvs,cds] = dwt2(ca,'db1');for i=1:Nfor j=1:Nif f(i,j)==0a=-1;else a=1;endCa(i,j)=cas(i,j)*(1+a*0.03);endendIM= idwt2(Ca,chs,cvs,cds,'db1')markedimage=double(idwt2(IM,ch,cv,cd,'db1'));subplot(2,2,3);colormap(gray(256));image(markedimage);title('marked image');imwrite(markedimage,gray(256),'c:\new\watermarked.bmp','bmp');%提取水印image1=imread(num2str(filename1));image1=double(image1); imaged=imread('c:\new\watermarked.bmp');[ca,ch,cv,cd] = dwt2(image1,'db1');[cas,chs,cvs,cds]=dwt2(ca,'db1');[caa,chh,cvv,cdd]=dwt2(imaged,'db1');[caas,chhs,cvvs,cdds]=dwt2(caa,'db1');for p=1:Nfor q=1:Na=caas(p,q)/cas(p,q)-1;if a<0W(p,q)=0;elseW(p,q)=255;end%频谱pic1= imread('c:\new\3.jpg');%pic=rgb2gray(pic);subplot(2,2,1);imshow(pic1);title('原图');pic_fft1=fft2(double(pic1));pic_fft1=fftshift(pic_fft1);subplot(2,2,2);imshow(log(abs(pic_fft1)),[]);title('原图频谱图');endendsubplot(2,2,4);colormap(gray(256));image(W);title('从含水印图像中提取的水印'); imwrite(W,gray(256),'watermark.bmp','bmp');%figure(4);h=bitxor(d,W);figure(7);subplot(2,2,1);imshow(h);pic2= imread('c:\new\watermarked.BMP');%pic=rgb2gray(pic);subplot(2,2,3);imshow(pic2);title('新图');pic_fft2=fft2(double(pic2));pic_fft2=fftshift(pic_fft2);subplot(2,2,4);imshow(log(abs(pic_fft2)),[]);title('新图频谱图'%DWT水印源码%嵌入源码clcclear all;% 保存开始时间start_time=cputime;iTimes=20; %置乱次数k=20;blocksize=8; % 设置块的大小filter_m=[ 1,1,1,1,1,1,1,1; % 滤波矩阵1,1,1,1,1,1,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,1,1,1,1,1,1;1,1,1,1,1,1,1,1 ];% 读入原图像file_name='_lena_std_bw.bmp';cover_object=double(imread(file_name));% 原图像的行数与列数Mc=size(cover_object,1); %原图像行数Nc=size(cover_object,2); %原图像列数% 最大嵌入信息量max_message=Mc*Nc/(blocksize^2);% 读入水印图像file_name='c.bmp';message=double(imread(file_name));%%水印图像的行数与列数Mm=size(message,1); %水印行数Nm=size(message,2); %水印列数% 检查水印信息是否过大if (Mm*Nm> max_message)error('水印太大')end%对水印图像进行arnold置乱if Mm~=Nmerror('水印矩阵必须为方阵');endif Mm~=40error('必须为40*40大小,或者修改置乱次数'); endtempImg=message;for n=1:iTimes % 次数for u=1:Mmfor v=1:Nmtemp=tempImg(u,v);ax=mod((u-1)+(v-1),Mm)+1;ay=mod((u-1)+2*(v-1),Nm)+1;outImg(ax,ay)=temp;endendtempImg=outImg;endmessage_vector=reshape(tempImg,1,Mm*Nm);% 产生watermarked_image,并写入原图信息watermarked_image=cover_object;%置随机数发生器的状态为1100key=1100;rand('state',key);% 产生伪随机序列pn_sequence_zero=round(2*(rand(1,sum(sum(filter_m)))-0.5)); pn_sequence_one=round(2*(rand(1,sum(sum(filter_m)))-0.5)); % 将图像分块嵌入% 当(2,2) > (2,3) 且message_pad(kk)=0% 当(2,2) < (2,3) 且message_pad(kk)=1%%经过分析可以得出结论:在提取水印时,如果cD1(2,2)>cD1(2,3)便是嵌入了水印的黑色像素,%%反之则是嵌入了白色像素x=1;y=1;h=waitbar(0,'嵌入水印,请等待');for (kk = 1:length(message_vector))% 对块进行DWT变换[cA1,cH1,cV1,cD1] =dwt2(cover_object(x:x+blocksize-1,y:y+blocksize-1),'haar');a=cD1;% 如果message_pad(kk)== 0if (message_vector(kk) == 0)% 且(2,2) < (2,3) ,交换它们if (cD1(2,2) < cD1(2,3))temp=cD1(2,3);cD1(2,3)=cD1(2,2);cD1(2,2)=temp;end% 如果message_pad(kk) == 1, elseif (message_vector(kk) == 1)% 且(2,2) > (2,3) ,交换它们if (cD1(2,2) >= cD1(2,3))temp=cD1(2,3);cD1(2,3)=cD1(2,2);cD1(2,2)=temp;endend% 检查(2,2) ,(2,3)的差是否>= k if cD1(2,2) > cD1(2,3)if cD1(2,2) - cD1(2,3) < kcD1(2,2)=cD1(2,2)+(k/2);cD1(2,3)=cD1(2,3)-(k/2);endelseif cD1(2,3) - cD1(2,2) < kcD1(2,3)=cD1(2,3)+(k/2);cD1(2,2)=cD1(2,2)-(k/2);endend%IDWTwatermarked_image(x:x+blocksize-1,y:y+blocksize-1)=idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);% 移动到下一块if (x+blocksize) >= Ncx=1;y=y+blocksize;elsex=x+blocksize;endwaitbar(kk/length(message_vector),h);endclose(h);% 转换为uint8并写入dwt_watermarked.bmpwatermarked_image_uint=uint8(watermarked_image);imwrite(watermarked_image_uint,'dwt_watermarked.bmp','bmp'); % 显示运行时间elapsed_time=cputime-start_time,% 显示图像figure(1)subplot(2,2,1);imshow(message,[]);title('水印');subplot(2,2,4)imshow(outImg,[]);title('置乱水印');subplot(2,2,2);imshow(cover_object,[]);title('原图');subplot(2,2,3);imshow(watermarked_image,[]) title('嵌入水印图像')%DWT源码%提取源码clear all;% 保存开始时间start_time=cputime;iTimes=20; %置乱次数blocksize=8; % 设置块的大小filter_m=[ 1,1,1,1,1,1,1,1; % 滤波矩阵1,1,1,1,1,1,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,0,0,0,0,1,1;1,1,1,1,1,1,1,1;1,1,1,1,1,1,1,1 ];% 读入嵌入水印图像[filename,pathname]=uigetfile('*.bmp;*tiff;*tif;*jpg','输入嵌有水印的图像'); watermarked_image=double(imread(filename));% 嵌入水印图像的行数与列数Mw=size(watermarked_image,1); %嵌入水印图像的行数Nw=size(watermarked_image,2); %嵌入水印图像的列数% 最大嵌入信息量max_message=Mw*Nw/(blocksize^2);% 读入原始水印file_name='c.bmp';orig_watermark=double(imread(file_name));% 原始水印的行数与列数Mo=size(orig_watermark,1); %原始水印的行数No=size(orig_watermark,2); %原始水印的列数%置随机数发生器的状态为1100rand('state',1100);% 产生伪随机序列pn_sequence_zero=round(2*(rand(1,sum(sum(filter_m)))-0.5));pn_sequence_one=round(2*(rand(1,sum(sum(filter_m)))-0.5));% 将图像分块提取水印x=1;y=1;h=waitbar(0,'水印提取中,请等待');for (kk = 1:max_message)% 对块进行dwt变换[cA1,cH1,cV1,cD1] =dwt2(watermarked_image(x:x+blocksize-1,y:y+blocksize-1),'haar');% 如果cD1(2,2) > cD1(3,3) 那么message_vector(kk)=0% 否则message_vector(kk)=1if cD1(2,2)>cD1(3,3)message_vector(kk)=0;elsemessage_vector(kk)=1;end% 移动到下一块if (x+blocksize) >= Mwx=1;y=y+blocksize;elsex=x+blocksize;endwaitbar(kk/max_message,h);endclose(h);% arnold置乱tempImg=reshape(message_vector(1:Mo*No),Mo,No); message_arnold=tempImg;for n=1:iTimes % 次数for u=1:Mofor v=1:Notemp=tempImg(u,v);ax=mod((u-1)+(v-1),Mo)+1;ay=mod((u-1)+2*(v-1),No)+1;outImg(ax,ay)=temp;endendtempImg=outImg;endmessage=tempImg;% 计算运行时间elapsed_time=cputime-start_time, % 显示提取水印与原始水印figure(3)subplot(1,3,1);imshow(message_arnold,[]);title('提取的置乱水印');subplot(1,3,2);imshow(message,[]);title('再次置乱后水印');subplot(1,3,3);imshow(orig_watermark,[])title('原始水印');。
图片数字水印C语言代码

图片数字水印C语言代码//本文算法实现的C语言代码,Windows XP平台DEV-CPP(4.9.9.2)环境下编译通过//#include //#include //#include //头文件#include //头文件#include //#include //#define MAX_ITERA 60 //常量宏定义#define MIN_DOUBLE (1e-30) //常量宏定义#define F_EXTPAD 4 //常量宏定义#define D_EXTPAD 2 //常量宏定义//函数原型预定义区域void RecoverWaterMark3(char *InVector,char *OutWater,double a);void InsertWaterMark3(char *InVector,char *OutVector,char *InWater,char *OutWater,double a);void RecoverWaterMark2(char *InVector,char *OutWater,double a);void InsertWaterMark2(char *InVector,char *OutVector,char *InWater,char *OutWater,double a);void RecoverWaterMark1(char *InVector,char *OutWater,double a);void InsertWaterMark1(char *InVector,char *OutVector,char *InWater,char *OutWater,double a);void Arnold256(char *in,char *out,unsigned char *q,int N,int k1,int k21,int k22,int k23,int k24,int type);int SVD(double a[],int m,int n,double u[],double v[],double eps);void Matrices(double a[],double b[],int m,int n,int k,double c[]);void ppp(double a[],double e[],double s[],double v[],int m,int n);void sss(double fg[2],double cs[2]);void YIQ2RGB(char *out,double *Y,double *I,double *Q,int N);void RGB2YIQ(char *in,char *out,double *Y,double *I,double *Q,int N);void DWT2D(double **rows, int width, int height, int levels,int inverse);void IDWT1D(double *x, int N);void DWT1D(double *x_in, int N);void CheckPSNR(double *p0,double *p1,int m,int n,double a);unsigned char Double2Char(double d);void Array2D1D(double **aa,double *a,int m,int n);void Array1D2D(double *a,double **aa,int m,int n);void errorNexit(char *s,char *d);void MsgBox(char *s,char *a,char *b);double MAX(double,double,double);static double *x_alloc = NULL; //静态内存指针//////////////////////////////////////主函数//////////////////////////////////////////////////////////////////////// //////载体图片默认为lmk.bmp-----------------必须为640*640*24bit//水印图片默认为W.bmp-------------------必须为64*64*8bit //W_a.bmp为水印图片加密后输出-----------大小为64*64*8bit //lmk_w10.bmp为嵌入水印后的载体图片------大小为640*640*24bit//lmk_w20.bmp为嵌入水印后的载体图片------大小为640*640*24bit//---a----------------------------------水印嵌入强度,初始默认为0.05//临时文件SLL3.dat,SLH3.dat,SHL3.dat,SHH3.dat,W.dat,Uw.dat,Vw.dat,分别保存了//载体图片LL3子图分解后的奇异值矩阵(double)------用于提取水印使用//载体图片LH3子图分解后的奇异值矩阵(double)------用于提取水印使用//载体图片HL3子图分解后的奇异值矩阵(double)------用于提取水印使用//载体图片HH3子图分解后的奇异值矩阵(double)------用于提取水印使用//原始水印加密后的数据矩阵(double)---------------用于评价NC//水印奇异值分解后的左奇异向量(double)-----------用于提取水印时合成水印图像//水印奇异值分解后的右奇异向量(double)-----------用于提取水印时合成水印图像//////////////////////////////////////主函数//////////////////////////////////////////////////////////////////////// ////int main(){double a=0.05; //初始嵌入强度int type=6,t;char *s;void (*insert)(),(*recover)(); //函数指针for(;;){printf("请选择嵌入方式:\n");printf(" 1:方式一 \n");printf(" 2:方式二 \n");printf(" 3:方式三 \n");printf(" 4:退出程序 \n\n");scanf("%d",&t);if(t==1) //选择嵌入方式1{insert=InsertWaterMark1;recover=RecoverWaterMark1;s="方式一";printf("已选中方式一,当前方式将把水印信息全部嵌入到LL3子图中。
matlab数字水印算法及实现和源代码

1.数字作品的知识产权保护----数字作品(如电脑美术、扫描图像、数字音乐、视频、三维动画)的版权保护是当前的热点问题。
由于数字作品的拷贝、修改非常容易,而且可以做到与原作完全相同,所以原创者不得不采用一些严重损害作品质量的办法来加上版权标志,而这种明显可见的标志很容易被篡改。
----“数字水印”利用数据隐藏原理使版权标志不可见或不可听,既不损害原作品,又达到了版权保护的目的。
目前,用于版权保护的数字水印技术已经进入了初步实用化阶段,IBM公司在其“数字图书馆”软件中就提供了数字水印功能,Adobe公司也在其著名的Photoshop软件中集成了Digimarc公司的数字水印插件。
然而实事求是地说,目前市场上的数字水印产品在技术上还不成熟,很容易被破坏或破解,距离真正的实用还有很长的路要走。
2.商务交易中的票据防伪----随着高质量图像输入输出设备的发展,特别是精度超过 1200dpi 的彩色喷墨、激光打印机和高精度彩色复印机的出现,使得货币、支票以及其他票据的伪造变得更加容易。
----另一方面,在从传统商务向电子商务转化的过程中,会出现大量过度性的电子文件,如各种纸质票据的扫描图像等。
即使在网络安全技术成熟以后,各种电子票据也还需要一些非密码的认证方式。
数字水印技术可以为各种票据提供不可见的认证标志,从而大大增加了伪造的难度。
3.证件真伪鉴别----信息隐藏技术可以应用的范围很广,作为证件来讲,每个人需要不只一个证件,证明个人身份的有:身份证、护照、驾驶证、出入证等;证明某种能力的有:各种学历证书、资格证书等。
国内目前在证件防伪领域面临巨大的商机,由于缺少有效的措施,使得“造假”、“买假”、“用假”成风,已经严重地干扰了正常的经济秩序,对国家的形像也有不良影响。
通过水印技术可以确认该证件的真伪,使得该证件无法仿制和复制。
4.声像数据的隐藏标识和篡改提示----数据的标识信息往往比数据本身更具有保密价值,如遥感图像的拍摄日期、经/纬度等。
LSB算法水印安全性测试及MATLAB实现

MATLAB - Matlab的优势和特点:(1)友好的工作平台和编程环境MATLAB由一系列工具组成。
这些工具方便用户使用MATLAB的函数和文件,其中许工具采用的是图形用户界面。
包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。
随着MATLAB的商业化以及软件本身的不断升级,MATLAB的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强,操作更简单。
而且新版本的MATLAB提供了完整的联机查询、帮助系统,极大的方便了用户的使用。
简单的编程环境提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。
(2)简单易用的程序语言Matlab一个高级的距阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和面向对象编程特点。
用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂的应用程序(M文件)后再一起运行。
新版本的MATLAB语言是基于最为流行的C++语言基础上的,因此语法特征与C+语言极为相似,而且更加简单,更加符合科技人员对数字表达式的书写格式。
使之更利于非计算机专业的科技人员使用。
而且这种语言可移植性好、可拓展性极强,这也是MATLAB之所以能够深入到科学研究及工程计算各个领域的重要原因。
LSB算法水印安全性测试LSB算法水印源码1、嵌入源码clear all;% 保存开始时间start_time=cputime;% 读入原图像file_name='1.jpeg';[cover_object,map]=imread(file_name);% 读入水印图像file_name='2.jpeg';[message,map1]=imread(file_name);message1=message;message=double(message); %%转换为double数message=fix(message./2); %%转换为0,1组成的矩阵message=uint8(message); %%转换为uint8数% 原图的行数与列数Mc=size(cover_object,1); %原图的行数Nc=size(cover_object,2); %原图的列数% 水印的行数与列数Mm=size(message,1); %水印的行数Nm=size(message,2); %水印的列数% 将水印扩展为原图像大小,并写入watermarkfor ii = 1:Mcfor jj = 1:Ncwatermark(ii,jj)=message(mod(ii,Mm)+1,mod(jj,Nm)+1);endend% 将原图的最低有效位值换为水印的值watermarked_image=cover_object;for ii = 1:Mcfor jj = 1:Ncwatermarked_image(ii,jj)=bitset(watermarked_image(ii,jj),1,watermark(ii,jj)); endend% 将嵌入水印图像写入lsb_watermarked.jpegimwrite(watermarked_image,'lsb_watermarked.jpeg','jpeg');% 显示运行时间elapsed_time=cputime-start_time,% 显示嵌入水印图像figure(1)subplot(1,2,1)imshow(watermarked_image,[])title('嵌入水印图像')subplot(1,2,2)imshow(cover_object,[])title('原图像')%%扩展后水印for ii = 1:Mcfor jj = 1:Ncwatermark1(ii,jj)=message1(mod(ii,Mm)+1,mod(jj,Nm)+1);endendfigure(2)imshow(watermark1,[])title('扩展后的水印')figure(3)imshow(message1,[])title('原水印')2、提取源码clear all;% 保存开始时间start_time=cputime;% 读入嵌入水印图像file_name='lsb_watermarked.jpeg ';watermarked_image=imread(file_name);% 嵌入水印图像的行数与列数Mw=size(watermarked_image,1); %嵌入水印图像行数Nw=size(watermarked_image,2); %嵌入水印图像列数%读入原始水印file_name='2.jpeg';orig_watermark=imread(file_name);%%原始水印的行数与列数Mm=size(orig_watermark,1); %水印的行数Nm=size(orig_watermark,1); %水印的列数% 用嵌入水印图像的最低有效位重建水印for ii = 1:Mwfor jj = 1:Nwwatermark(ii,jj)=bitget(watermarked_image(ii,jj),1);endend% 将提取水印变为原始水印大小watermark=2*double(watermark);for ii = 1:Mm-1for jj = 1:Nm-1watermark1(ii+1,jj+1)=watermark(ii,jj);endendwatermark1(1,1)=watermark(Mm,Nm);% 显示运行时间elapsed_time=cputime-start_time,% 显示提取水印与原始水印figure(4)subplot(1,2,1)imshow(watermark1,[])title('提取水印')subplot(1,2,2)imshow(orig_watermark,[])title('原始水印')3、中值滤波处理二维中值滤波器对图像的处理是用一个二维的窗口去依次成块地覆盖图像中的像素,用覆盖的那些像素值的中值去取代窗口正中的那个像素的值。
PHP添加文字水印或图片水印的水印类完整源代码与使用示例

PHP添加⽂字⽔印或图⽚⽔印的⽔印类完整源代码与使⽤⽰例PHP实现的给图⽚添加⽔印功能,可添加⽂字⽔印或图⽚⽔印,使⽤⽂字⽔印时需要提供字体⽂件,使⽤图⽚⽔印时需要提供⽔印图⽚,⽔印图⽚不能⽐要添加⽔印的图⽚⼤,请使⽤背景透明的⽔印图⽚。
该⽔印类⽀持⾃定义⽔印位置、⾃定义⽔印⼤⼩和⽔印的透明度,字体⽔印可⾃定义颜⾊等,功能已相应完善。
完整源代码如下(注解中已给出使⽤⽰例):<?php/*** 图⽚加⽔印类,⽀持⽂字⽔印、透明度设置、⾃定义⽔印位置等。
* 使⽤⽰例:* $obj = new WaterMask($imgFileName); //实例化对象* $obj->$waterType = 1; //类型:0为⽂字⽔印、1为图⽚⽔印* $obj->$transparent = 45; //⽔印透明度* $obj->$waterStr = ''; //⽔印⽂字* $obj->$fontSize = 18; //⽂字字体⼤⼩* $obj->$fontColor = array(255,255,255); //⽔印⽂字颜⾊(RGB)* $obj->$fontFile = 'AHGBold.ttf'; //字体⽂件* ……* $obj->output(); //输出⽔印图⽚⽂件覆盖到输⼊的图⽚⽂件*/class WaterMask{public $waterType = 0; //⽔印类型:0为⽂字⽔印、1为图⽚⽔印public $pos = 0; //⽔印位置public $transparent = 45; //⽔印透明度public $waterStr = ''; //⽔印⽂字public $fontSize = 18; //⽂字字体⼤⼩public $fontColor = array(255,255,255); //⽔印⽂字颜⾊(RGB)public $fontFile = 'AHGBold.ttf'; //字体⽂件public $waterImg = 'logo.png'; //⽔印图⽚private $srcImg = ''; //需要添加⽔印的图⽚private $im = ''; //图⽚句柄private $water_im = ''; //⽔印图⽚句柄private $srcImg_info = ''; //图⽚信息private $waterImg_info = ''; //⽔印图⽚信息private $str_w = ''; //⽔印⽂字宽度private $str_h = ''; //⽔印⽂字⾼度private $x = ''; //⽔印X坐标private $y = ''; //⽔印y坐标function __construct($img) { //析构函数$this->srcImg = file_exists($img) ? $img : die('"'.$img.'" 源⽂件不存在!');}private function imginfo() { //获取需要添加⽔印的图⽚的信息,并载⼊图⽚。
(完整word版)数字水印源码

数字水印源码,希望对大家学习有帮助.%由高斯正态分布序列g1 产生36×4 的水印信%号w0,w0 由(0,1)组成。
clearrandn(’state’,1106);g1=randn(36,4);for i=1:36for j=1:4if g1(i,j)〉=0w0(i,j)=1;else w0(i,j)=0;end;end;end;figure;imshow(w0);title('水印');%对水印信号w0 进行(7,4)汉明编码,得到一%36×7 的分组码x0。
x0=w0;for i=1:36s=8*x0(i,1)+4*x0(i,2)+2*x0(i,3)+x0(i,4);x0(i,5)=0;x0(i,6)=0;x0(i,7)=0;case 1x0(i,5)=0;x0(i,6)=1;x0(i,7)=1; case 2x0(i,5)=1;x0(i,6)=1;x0(i,7)=0; case 3x0(i,5)=1;x0(i,6)=0;x0(i,7)=1; case 4x0(i,5)=1;x0(i,6)=1;x0(i,7)=1; case 5x0(i,5)=1;x0(i,6)=0;x0(i,7)=0;case 6x0(i,5)=0;x0(i,6)=0;x0(i,7)=1;case 7x0(i,5)=0;x0(i,6)=1;x0(i,7)=0;case 8x0(i,5)=1;x0(i,6)=0;x0(i,7)=1;case 9x0(i,5)=1;x0(i,6)=1;x0(i,7)=0;case 10x0(i,5)=0;x0(i,6)=1;x0(i,7)=1;case 11x0(i,5)=0;x0(i,6)=1;x0(i,7)=0;case 13x0(i,5)=0;x0(i,6)=0;x0(i,7)=1;case 14x0(i,5)=1;x0(i,6)=0;x0(i,7)=0;case 15x0(i,5)=1;x0(i,6)=1;x0(i,7)=1;end;end;% 对x0 进行行向位扩展,得到一个由(—1,1)组成%的扩展序列y。
c#图片添加水印的实例代码

c#图片添加水印的实例代码c#图片添加水印的实例代码,有需要的朋友可以参考一下。
复制代码代码如下:using System;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System.IO;namespace ImageDrawing{/// <summary>/// 图片修改类,主要是用来保护图片版权的/// </summary>public class ImageModification{#region "member fields"private string modifyImagePath=null;private string drawedImagePath=null;private int rightSpace;private int bottoamSpace;private int lucencyPercent=70;private string outPath=null;#endregionpublic ImageModification(){}#region "propertys"/// <summary>/// 获取或设置要修改的图像路径/// </summary>public string ModifyImagePath{get{return this.modifyImagePath;}set{this.modifyImagePath=value;}}/// <summary>/// 获取或设置在画的图片路径(水印图片)/// </summary>public string DrawedImagePath{get{return this.drawedImagePath;}set{this.drawedImagePath=value;}}/// <summary>/// 获取或设置水印在修改图片中的右边距/// </summary>public int RightSpace{ // 脚本学堂 get{return this.rightSpace;}set{this.rightSpace=value;}}//获取或设置水印在修改图片中距底部的高度public int BottoamSpace{get{return this.bottoamSpace;}set{this.bottoamSpace=value;}}/// <summary>/// 获取或设置要绘制水印的透明度,注意是原来图片透明度的百分比/// </summary>public int LucencyPercent{get{return this.lucencyPercent;}set{if(value>=0&&value<=100)this.lucencyPercent=value;}}/// <summary>/// 获取或设置要输出图像的路径/// </summary>public string OutPath{get{return this.outPath;}set{this.outPath=value;}}#endregion#region "methods"/// <summary>/// 开始绘制水印/// </summary>public void DrawImage(){Image modifyImage=null;Image drawedImage=null;Graphics g=null;try{//建立图形对象modifyImage=Image.FromFile(this.ModifyImagePath);drawedImage=Image.FromFile(this.DrawedImagePath);g=Graphics.FromImage(modifyImage);//获取要绘制图形坐标int x=modifyImage.Width-this.rightSpace;int y=modifyImage.Height-this.BottoamSpace;//设置颜色矩阵float[][] matrixItems ={new float[] {1, 0, 0, 0, 0},new float[] {0, 1, 0, 0, 0},new float[] {0, 0, 1, 0, 0},new float[] {0, 0, 0, (float)this.LucencyPercent/100f, 0},new float[] {0, 0, 0, 0, 1}};ColorMatrix colorMatrix = new ColorMatrix(matrixItems);ImageAttributes imgAttr=new ImageAttributes();imgAttr.SetColorMatrix(colorMatrix,ColorMatrixFlag.Default, ColorAdjustType.Bitmap);//绘制阴影图像g.DrawImage(drawedImage,new Rectangle(x,y,drawedImage.Width,drawedImage.Heigh t),0,0,drawedImage.Width,drawedImage.Height,GraphicsUnit.Pixel,imgAttr);//保存文件string[] allowImageType={".jpg",".gif",".png",".bmp",".tiff",". wmf",".ico"};FileInfo file=new FileInfo(this.ModifyImagePath);ImageFormat imageType=ImageFormat.Gif; switch(file.Extension.ToLower()){ // 脚本学堂 case ".jpg":imageType=ImageFormat.Jpeg;break;case ".gif":imageType=ImageFormat.Gif;break;case ".png":imageType=ImageFormat.Png;break;case ".bmp":imageType=ImageFormat.Bmp;break;case ".tif":imageType=ImageFormat.Tiff;break;case ".wmf":imageType=ImageFormat.Wmf;break;case ".ico":imageType=ImageFormat.Icon;break;default:break;}MemoryStream ms=new MemoryStream(); modifyImage.Save(ms,imageType);byte[] imgData=ms.ToArray();modifyImage.Dispose();drawedImage.Dispose();g.Dispose();FileStream fs=null;if(this.OutPath==null || this.OutPath==""){File.Delete(this.ModifyImagePath);fs=new FileStream(this.ModifyImagePath,FileMode.Create,Fi leAccess.Write);}else{fs=new FileStream(this.OutPath,FileMode.Create,FileAccess. Write);}if(fs!=null){fs.Write(imgData,0,imgData.Length);fs.Close();}}finally{try{drawedImage.Dispose();modifyImage.Dispose();g.Dispose();}catch{;}}}#endregion }}。