2024年4月19日发(作者:)

//转换公式为Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j),

//其中Gray(i,j)为转换后的黑白图像在(i,j)点处的灰度值,

//其中绿色所占的比重最大,所以转换时可以直接使用G值。

void CWaterMarkDlg::OnWaterEmbed()

{

// TODO: Add your control notification handler code here

if ((bm[0].bmHeight*bm[0].bmWidth)<3*(bm[1].bmHeight*bm[1].bmWidth))

{

//不能嵌入水印

MessageBox("水印图象过大请更换较大宿主图象","错误",MB_OK);

Mark=FALSE;

}

if(!Mark)

return ;

if(biBitCount

{

MessageBox("水印受限制");

return ;

}

RGBQUAD *m_copymater; //定义一个水印信息的数据副本

m_copymater = new RGBQUAD [WaterHeight*WaterWidth];

int i,j;

int count=0;

BYTE m_r,m_b;

if(m_waterEmbed !=NULL) //m_waterEmbed是水印.嵌入后.的位图数据全局变量

if(m_Ih!=0)

for(int l =0;l

delete [] m_waterEmbed[l];

m_waterEmbed = new RGBQUAD*[ImageHeight];

for(i=0;i

m_waterEmbed[i] = new RGBQUAD [ImageWidth];

for(i=0;i

for(j=0;j

m_waterEmbed[i][j]=m_tOriPixelArray[i][j];

for(i=0;i

//将水印信息的数据复制到一维数组m_copymater水印信息的数据副本里

for(j=0;j

{

m_copymater[i*WaterHeight+j]=m_watermarkdata[i][j];

count++;

}

number=count;//记录嵌入的点数

int k=0;

if (biBitCount==24) //Operate_Byte()嵌入水印信息位操作

{

for(i=0;i0;i++)

for(j=0;j0;j++,count--)

//下面可以用一条语句的但为了测试还是多句

{

m_r=m_waterEmbed[i][j].rgbRed;

m_b=m_waterEmbed[i][j].rgbBlue;

BYTE &a=m_r;

BYTE &b=m_b;

BYTE c=m_copymater[i*ImageHeight+j].rgbGreen;

Operate_Byte(a,b,c);

m_waterEmbed[i][j].rgbRed=m_r;

m_waterEmbed[i][j].rgbBlue=m_b;

}

PutInWaterMessage();

}

else

return;

CDC *dc=GetDC();//将象素打印出来

RECT m_rect;

float w,h,p,q;

GetDlgItem(IDC_STATIC2)->GetClientRect(&m_rect);

if(m_

w=(float)m_/(float)ImageWidth;

h=(float)m_/(float)ImageHeight;

}

else

w=h=1;

for( p=0,i=0;i

for( j=0, q=0;j

dc->SetPixel(2+(int)(q*w),235+(int)(p*h),RGB(m_waterEmbed[i][j].rgbRed,

m_waterEmbed[i][j].rgbGreen,m_waterEmbed[i][j].rgbBlue));

ReleaseDC(dc);

delete [] m_copymater;

m_Ih=ImageHeight; //为保证直接更换水印信息而没有更换宿主图象提供原宽高 void error bug

m_Iw=ImageWidth;

m_Wh=WaterHeight;

m_Ww=WaterWidth;

TRACE("n%dn",ImageHeight);

GetDlgItem(IDC_BUTTON4)->EnableWindow(TRUE);

GetDlgItem(IDC_BUTTON5)->EnableWindow(TRUE);

}