📄 watermarkxview.cpp
字号:
long lStyle = ::GetWindowLong(hFig,GWL_STYLE);
::SetWindowLong(hFig,GWL_STYLE,lStyle & (~WS_CAPTION) & (~WS_THICKFRAME));
::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
// 获取绘图区域的位置和大小
RECT PlotRec;
CWnd *PlotArea = GetDlgItem(IDC_PLOTAREA);
PlotArea->GetWindowRect(&PlotRec);
long Width = PlotRec.right - PlotRec.left;
long Height = PlotRec.bottom - PlotRec.top;
// 设置Figure窗口为绘图区域窗口的子窗口并调整其位置
::SetParent(hFig,PlotArea->GetSafeHwnd());
::SetWindowPos(hFig,NULL,1,1,Width-3,Height-3,SWP_NOZORDER | SWP_NOACTIVATE);
}
}
mwArray CWaterMarkxView::Get_h(mwArray strFigName, mwArray BKColor, mwArray strVisible)
{
h_fig = figure(
mwArray("DoubleBuffer"), mwArray("On"),
mwArray("NumberTitle"), mwArray("Off"),
mwArray("Name"), strFigName,
mwArray("Menubar"), mwArray("None"),
mwArray("Color"), BKColor,
mwArray("Visible"), strVisible);
// h_a = axes("Parent",h_f,"Box","On");
// h_a = axes(mwArray("Parent"), h_fig, mwArray("Box"), mwArray("Off"));
//h_a=subplot(mwArray(1),mwArray(1),mwArray(1),mwArray("replace"));
return h_a;
}
void CWaterMarkxView::SetVisible(mwArray h_a, mwArray strVisible)
{
// h_f = get(h_a,"Parent");
mwArray h_f = get(h_a, mwArray("Parent"));
// set(h_f,"Visible",strVisible);
Vset(h_f, mwArray("Visible"), strVisible);
}
void CWaterMarkxView::OnClose()
{
// TODO: Add your message handler code here and/or call default
// 在退出程序时关闭打开的Figure窗口
// close('all');
if(~h_a.IsEmpty())
h_a.Clear();
if(~h_fig.IsEmpty())
h_fig.Clear();
close(mwArray("all"));
CFormView::OnClose();
}
void CWaterMarkxView::DCTWater()
{
/*%**********************************************************
%图像分块作DCT,用两个不相关的伪随机序列分别代表水印信息中的0和1,潜入到DCT域的中频部分
%注:此算法为水印嵌入算法。
%一位一位来
%********************************************************* */
CString str;
startime=CTime::GetCurrentTime();
// str.Format("%02d:%02d:%02d",startime.GetHour(),startime.GetMinute(),startime.GetSecond());
// MessageBox(str);
int jj=0,ii=0;
mwArray DI1,WW,DWW,FDI,MID1;
WW=round(rdivide(double_func(W),mwArray(256)));
EI=I;
//%初始化扫描原始图像I的x和y
int I_x=1;
int I_y=1;
// %初始化扫描水印W的x和y
int W_x=1;
int W_y=1;
for(int kk=1;kk<water_block;)
{
DI1=dct2(I(colon(mwArray(I_y),mwArray(I_y+blocksize-1)),\
colon(mwArray(I_x),mwArray(I_x+blocksize-1))) );//%对原始图像I进行离散余弦变换
DWW=WW(colon(mwArray(kk),mwArray(kk+3))); //%得到水印块
FDI=floor(DI1);
MID1=mod(FDI,mwArray(4*G));
for(int t=1;t<=watersize;t++)
{
if( tobool(DWW(mwArray(t))==mwArray(0)) )
{ for(ii=2*t-1;ii<=2*t;ii++)
for(jj=1;jj<=blocksize;jj++)
if(midband[ii][jj]==1)
DI1(mwArray(ii),mwArray(jj))=DI1(mwArray(ii),mwArray(jj))\
+mwArray(A*G)-MID1(mwArray(ii),mwArray(jj));
}
else
{ for(ii=2*t-1;ii<=2*t;ii++)
for(jj=1;jj<=blocksize;jj++)
if(midband[ii][jj]==1)
DI1(mwArray(ii),mwArray(jj))=DI1(mwArray(ii),mwArray(jj))\
+mwArray(B*G)-MID1(mwArray(ii),mwArray(jj));
}
}
// %离散余弦逆变换得到q嵌入水印后的图像EI
EI(colon(mwArray(I_y),mwArray(I_y+blocksize-1)),\
colon(mwArray(I_x),mwArray(I_x+blocksize-1)))=idct2(DI1);
//horzcat();
// %~~~~~~~~~~*****原始图像扫描********~~~~~~~~~~~~~~~~~~~~
if((I_x+blocksize)>=(i_Nc-8))
{ I_x=1;
I_y=I_y+blocksize;
}
else
I_x=I_x+blocksize;
kk+=4;
}
//subplot(mwArray(2),mwArray(2),mwArray(3));
//imshow(EI);
//title(mwArray("已嵌入水印的图像"));
endtime=CTime::GetCurrentTime();
// str.Format("%02d:%02d:%02d",endtime.GetHour(),endtime.GetMinute(),endtime.GetSecond());
// MessageBox(str);
costime=endtime-startime;
// str.Format("%02d:%02d:%02d",costime.GetHours(),costime.GetMinutes(),costime.GetSeconds());
// MessageBox(str);
EI_1=EI;
int i,j;
double *qianruData=new double[i_Mc*i_Nc];
for(i=0;i<i_Mc*i_Nc;i++)
{
qianruData[i] = *(mxGetPr(EI.GetData())+i);
}
//mwArray Itemp =double_func(rgb2gray(I));
//mwArray EItemp=double_func(rgb2gray(EI));
mwArray Itemp =double_func(I);
mwArray EItemp=double_func(EI);
GetCoef(Itemp ,i_Mc,i_Nc,EItemp); //得到相关系数
//GetCoef(I ,i_Mc,i_Nc,EI); //得到相关系数
LPSTR lpDIB;
DWORD dwBitsSize;
LONG lLineBytes;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_OriginHDIB);
DWORD biSize;
biSize=((LPBITMAPINFOHEADER)lpDIB)->biSize;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(i_Nc * 8);
dwBitsSize = lLineBytes*i_Mc;
if(m_QianruHDIB==NULL)
{
m_QianruHDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, m_OriginImageSize - sizeof(BITMAPFILEHEADER));
}
CopyHDIB(m_OriginHDIB,m_QianruHDIB,0);
LPSTR lpDIBBits_Source;
unsigned char* lpSrcs;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_QianruHDIB);
lpDIBBits_Source = ::FindDIBBits(lpDIB);
for( i = 0; i < i_Mc; i++)
{
for( j = 0; j <i_Nc; j++)
{
lpSrcs = (unsigned char*)lpDIBBits_Source + lLineBytes * i + j;
*(lpSrcs)=(unsigned char)qianruData[j+i*i_Nc];
}
}
delete[] qianruData;
this->Invalidate();
}
void CWaterMarkxView::DCTCheck()
{ /*%**********************************************************
%图像分块作DCT,用两个不相关的伪随机序列分别代表水印信息中的0和1,潜入到DCT域的中频部分
%注:此算法为水印提取算法。
%一位一位来
%********************************************************* */
CString str;
startime=CTime::GetCurrentTime();
// str.Format("%02d:%02d:%02d",startime.GetHour(),startime.GetMinute(),startime.GetSecond());
// MessageBox(str);
mwArray S(abs(A-B)*G);
// mwArray Im_filename(filename),Water_filename("5555.bmp");
int jj=0,ii=0,num=0;
mwArray EWI1,DEI1,FDEI1,MFDEI1;
mwArray nn=1;
mwArray WW=round(rdivide(double_func(W),mwArray(256)));
//%初始化扫描原始图像I的x和y
int EI_x=1;
int EI_y=1;
// %初始化扫描水印W的x和y
int EWI_x=1;
int EWI_y=1;
for(int kk=1;kk<=water_block;)
{
DEI1=dct2(EI_1(colon(mwArray(EI_y),mwArray(EI_y+blocksize-1)),\
colon(mwArray(EI_x),mwArray(EI_x+blocksize-1))) );//%对原始图像I进行离散余弦变换
FDEI1=floor(DEI1);
MFDEI1=mod(FDEI1,mwArray(4*G));
for(int t=1;t<=watersize;t++)
{
num=0;
for(ii=2*t-1;ii<=2*t;ii++)
for(jj=1;jj<=blocksize;jj++)
if(midband[ii][jj]==1)
if(tobool(MFDEI1(mwArray(ii),mwArray(jj))>S))
num=num+1;
if(num>3)
EWI1(nn)=1;
else
EWI1(nn)=0;
nn++;
}
// %~~~~~~~~~~*****对需检测图像扫描********~~~~~~~~~~~~~~~~~~~~
if((EI_x+blocksize)>=(i_Nc-8))
{
EI_x=1;
EI_y=EI_y+blocksize;
}
else
EI_x=EI_x+blocksize;
kk+=4;
}
EWI2=reshape(EWI1,Mw,Nw);
double *TiquData=new double[i_Mw*i_Nw];
int i,j;
for(i=0;i<i_Mw*i_Nw;i++)
{
TiquData[i] = *(mxGetPr(EWI2.GetData())+i);
if(TiquData[i]>0)
TiquData[i]=255;
}
LPSTR lpDIB;
DWORD dwBitsSize;
LONG lLineBytes;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_SuiyinHDIB);
DWORD biSize;
biSize=((LPBITMAPINFOHEADER)lpDIB)->biSize;
::GlobalUnlock((HGLOBAL) m_SuiyinHDIB);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(i_Nw * 8);
dwBitsSize = lLineBytes*i_Mw;
if(m_TiquHDIB==NULL)
{
m_TiquHDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, m_SuiyinImageSize - sizeof(BITMAPFILEHEADER));
}
if(m_SuiyinHDIB!=NULL)
{
//CopyHDIB(m_SuiyinHDIB,m_TiquHDIB,m_SuiyinImageSize - sizeof(BITMAPFILEHEADER)-::PaletteSize(lpDIB)-biSize);
CopyHDIB(m_SuiyinHDIB,m_TiquHDIB,0);
}
LPSTR lpDIBBits_Source;
unsigned char* lpSrcs;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_TiquHDIB);
lpDIBBits_Source = ::FindDIBBits(lpDIB);
for( i = 0; i < i_Mw; i++)
{
for( j = 0; j <i_Nw; j++)
{
lpSrcs = (unsigned char*)lpDIBBits_Source + lLineBytes * i + j;
*(lpSrcs)=(unsigned char)TiquData[j+i*i_Nw];
}
}
delete[] TiquData;
::GlobalUnlock((HGLOBAL) m_TiquHDIB);
this->Invalidate();
// %~~~~~~~~~~*****显示检测出的水印图像********~~~~~~~~~~~~~~~~~~~~
//subplot(mwArray(2),mwArray(2),mwArray(4));
//imshow(EWI2);
//title(mwArray("检测到的水印图像"));
endtime=CTime::GetCurrentTime();
// str.Format("%02d:%02d:%02d",endtime.GetHour(),endtime.GetMinute(),endtime.GetSecond());
// MessageBox(str);
costime=endtime-startime;
// str.Format("%02d:%02d:%02d",costime.GetHours(),costime.GetMinutes(),costime.GetSeconds());
// MessageBox(str);
mwArray Wtemp =double_func(WW);
mwArray EWItemp=double_func(EWI2);
GetCoef(Wtemp ,i_Mw,i_Nw,EWItemp); //得到相关系数
}
void CWaterMarkxView::OnWaterInsert()
{
// TODO: Add your command handler code here
//嵌入水印
bWait = 0;
m_title.SetCaption("数字水印嵌入");
UpdateData(FALSE);
try{
SetTimer(1,1000,NULL);
DCTWater();
busydlg.DoModal(); //等待
bshow=3;
bsave_I=1;
// 设置窗口可见
//SetVisible(h_a,mwArray("On"));
// 进入窗口等待状态
//mlfHGWaitForFiguresToDie();
}
catch (mwException & ex){
mwDisplayException(ex);
}
}
void CWaterMarkxView::OnWaterDistill()
{
// TODO: Add your command handler code here
// 检测水印
bWait=1;
m_title.SetCaption("数字水印检测");
UpdateData(FALSE);
try{
SetTimer(2,1000,NULL);
//DCTCheck();
busydlg.DoModal(); //等待
//只有打开原始图像和打开需检测的图像可选
binsert=0;
bshow=0;
bcheck=0;
bdishow=0;
//可以保存图像或水印
bsave_C=1;
// 设置窗口可见
SetVisible(h_a,mwArray("On"));
// 进入窗口等待状态
mlfHGWaitForFiguresToDie();
}
catch (mwException & ex){
mwDisplayException(ex);
}
}
void CWaterMarkxView::OnFileOpen()
{
// TODO: Add your command handler code here
//打开原始图像
// clf(mwArray(1)); //清除图像
CString str;
// sndPlaySound("Over-delete.wav",SND_ASYNC|SND_FILENAME);//播放按键音乐
/*if(tobool(isempty(h_a)))
CreatFigDlg();
else
{*/
try{
OpenFileDlg(0); //打开原始图像
if(!Filename.IsEmpty())
{
//Im_filename=mwArray(Filename);
//原始图像打开
bshow=1;
binsert=1;
bsave_I=0;//不能保存图像
bsave_C=0;
//subplot(mwArray(1),mwArray(2),mwArray(1));
//I=imread(NULL,NULL,Im_filename); //%读取原始图像
CFile file;
// 打开文件
if( !file.Open(Filename, CFile::modeRead | CFile::shareDenyWrite))
{
// 返回
return ;
}
if (m_OriginHDIB != NULL)
{
// 清除DIB对象
::GlobalFree((HGLOBAL) m_OriginHDIB);
m_OriginHDIB=NULL;
}
//DeleteContents();
// 更改光标形状
BeginWaitCursor();
// 尝试调用ReadDIBFile()读取图像
TRY
{
//m_OriginHDIB = ::ReadDIBFile(file);
m_OriginHDIB=::ReadDIBFile(file);
}
CATCH (CFileException, eLoad)
{
// 读取失败
file.Abort();
// 恢复光标形状
EndWaitCursor();
// 报告失败
// ReportSaveLoadException(strPathName, eLoad,FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -