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;i for(j=0;j //下面可以用一条语句的但为了测试还是多句 { 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); }
发布评论