📄 watermarkxview.cpp
字号:
// 设置DIB为空
m_OriginHDIB = NULL;
return ;
}
END_CATCH
// 恢复光标形状
EndWaitCursor();
// 判断读取文件是否成功
if (m_OriginHDIB == NULL)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
// 提示出错
MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回FALSE
return ;
}
LPSTR lpDIB;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_OriginHDIB);
int nNumcolor=::DIBNumColors(lpDIB);
if(nNumcolor!=256)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "目前该程序只能处理256色灰度格式图象,请选择该格式图象";
// 提示出错
MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回FALSE
::GlobalUnlock((HGLOBAL) m_OriginHDIB);
::GlobalFree((HGLOBAL) m_OriginHDIB);
m_OriginHDIB=NULL;
return ;
}
CalImageLocation();
OnInitData();
m_OriginImageSize = file.GetLength();
/*LPSTR lpDIB;
DWORD dwBitsSize, dwBitSize1;
LONG lLineBytes;
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_OriginHDIB);
DWORD biSize;
biSize=((LPBITMAPINFOHEADER)lpDIB)->biSize;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(::DIBWidth(lpDIB) * 8);
dwBitsSize = file.GetLength();
dwBitSize1=lLineBytes*(::DIBHeight(lpDIB));
::GlobalUnlock((HGLOBAL) m_OriginHDIB);
// int xx=sizeof(BITMAPFILEHEADER);
if(m_QianruHDIB==NULL)
{
m_QianruHDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize - sizeof(BITMAPFILEHEADER));
}
CopyHDIB(m_OriginHDIB,m_QianruHDIB,dwBitsSize-biSize-::PaletteSize(lpDIB)-sizeof(BITMAPFILEHEADER));
*/
this->Invalidate();
file.Close();
i_max_message=(::DIBHeight(lpDIB)/blocksize)*(::DIBWidth(lpDIB)/blocksize);
i_Mc=::DIBHeight(lpDIB);
i_Nc=::DIBWidth(lpDIB);
::GlobalUnlock((HGLOBAL) m_OriginHDIB);
double *OriginData=new double[i_Mc*i_Nc];
LPSTR lpDIBBits;
unsigned char *lpSrc;
int i,j;
LONG lLineBytes;
lpDIBBits = ::FindDIBBits(lpDIB);
lLineBytes = WIDTHBYTES(i_Nc * 8);
for( i = 0; i < i_Mc; i++)
{
for( j = 0; j < i_Nc; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes *i + j;
// 给时域赋值
OriginData[j + i * i_Nc] = *(lpSrc);
}
}
I=mwArray(i_Mc,i_Nc,OriginData);
Mc=size(I,mwArray(1));
Nc=size(I,mwArray(2));
mwArray temp=fix( rdivide(Mc,mwArray(blocksize)) );
mwArray temp1=fix(rdivide(Nc,mwArray(blocksize)) );
max_message=times(temp,temp1); //原始图像的最大分块数
//转化为整型
i_Mc=(int)Mc.ExtractScalar(1);
i_Nc=(int)Nc.ExtractScalar(1);
delete[] OriginData;
//确定载体图像的大小
/*Mc=size(I,mwArray(1));
Nc=size(I,mwArray(2));
mwArray temp=fix( rdivide(Mc,mwArray(blocksize)) );
mwArray temp1=fix(rdivide(Nc,mwArray(blocksize)) );
max_message=times(temp,temp1); //原始图像的最大分块数
//转化为整型
i_Mc=(int)Mc.ExtractScalar(1);
i_Nc=(int)Nc.ExtractScalar(1);
//i_max_message=(int)max_message.ExtractScalar(1);
i_max_message=(i_Mc/blocksize)*(i_Nc/blocksize);
mwArray h;
h=imagesc(I);
title(mwArray("原始图像"));
// 设置窗口可见
SetVisible(h_a,mwArray("On"));
// 进入窗口等待状态
//mlfHGWaitForFiguresToDie();*/
}
}
catch (mwException & ex)
{
mwDisplayException(ex);
}
//}
}
void CWaterMarkxView::OnFileOpenWater()
{
// TODO: Add your command handler code here
//打开水印图像
// clf(mwArray(1)); //清除图像
int error=0;
CString str;
try{
OpenFileDlg(1); //打开水印图像
if(!Filename.IsEmpty())
{
/*Water_filename=mwArray(Filename);
//水印图像打开
bshow=2;
bdishow=-2;
W=imread(NULL,NULL,Water_filename); // 读取水印图像
// 确定水印图像的大小
Mw=size(W,mwArray(1));
Nw=size(W,mwArray(2));
//转化为整型
i_Mw=(int)Mw.ExtractScalar(1);
i_Nw=(int)Nw.ExtractScalar(1);
water_block=(int)i_Mw*i_Nw; //水印的块数
*/
CFile file;
// 打开文件
if( !file.Open(Filename, CFile::modeRead | CFile::shareDenyWrite))
{
// 返回
return ;
}
if (m_SuiyinHDIB != NULL)
{
// 清除DIB对象
::GlobalFree((HGLOBAL) m_SuiyinHDIB);
m_SuiyinHDIB=NULL;
}
// 更改光标形状
BeginWaitCursor();
// 尝试调用ReadDIBFile()读取图像
TRY
{
m_SuiyinHDIB = ::ReadDIBFile(file);
}
CATCH (CFileException, eLoad)
{
// 读取失败
file.Abort();
// 恢复光标形状
EndWaitCursor();
m_SuiyinHDIB = NULL;
return ;
}
END_CATCH
m_SuiyinImageSize=file.GetLength();
file.Close();
// 恢复光标形状
EndWaitCursor();
// 判断读取文件是否成功
if (m_SuiyinHDIB == NULL)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
// 提示出错
MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回FALSE
return ;
}
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_SuiyinHDIB);
int nNumcolor=::DIBNumColors(lpDIB);
if(nNumcolor!=256)
{
// 失败,可能非BMP格式
CString strMsg;
strMsg = "目前该程序只能处理256色灰度格式图象,请选择该格式图象";
// 提示出错
MessageBox(strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
// 返回FALSE
::GlobalFree((HGLOBAL) m_SuiyinHDIB);
m_SuiyinHDIB=NULL;
return ;
}
CalImageLocation();
OnInitData();
this->Invalidate();
bshow=2;
bdishow=-2;
i_Mw=::DIBHeight(lpDIB);
i_Nw=::DIBWidth(lpDIB);
water_block=i_Mw*i_Nw;
Mw=mwArray(i_Mw);
Nw=mwArray(i_Nw);
double *SuiyinData=new double[i_Mw*i_Nw];
LPSTR lpDIBBits;
unsigned char *lpSrc;
int i,j;
LONG lLineBytes;
lpDIBBits = ::FindDIBBits(lpDIB);
lLineBytes = WIDTHBYTES(i_Nw * 8);
for( i = 0; i < i_Mw; i++)
{
for( j = 0; j < i_Nw; j++)
{
lpSrc = (unsigned char*)lpDIBBits + lLineBytes *i + j;
// 给时域赋值
SuiyinData[j + i * i_Nw] = *(lpSrc);
}
}
W=mwArray(i_Mw,i_Nw,SuiyinData);
delete[] SuiyinData;
if(water_block>4*i_max_message) //判断是否可以完全嵌入此水印数据
{
// CInformation infor;
if(binsert)
infor.Setdata(i_Mc,i_Nc,i_max_message,i_Mw,i_Nw,water_block);
if(bcheck)
infor.Setdata(i_Mc,i_Nc,i_max_message,i_Mw,i_Nw,water_block);
int breturn=infor.DoModal();
// UpdateData(FALSE);
if(breturn==IDOK)
{
Filename.Empty();
OnFileOpenWater(); //打开水印图像
}
Filename.Empty();
error=1;
}
if(!error)
{
//subplot(mwArray(2),mwArray(2),mwArray(2));
//imshow(W); // 显示水印图像
//title(mwArray("水印图像"));
//subplot(mwArray(2),mwArray(2),mwArray(1));
if(binsert)
{
//imshow(I);
//title(mwArray("原始图像"));
}
if(bcheck)
{
//imshow(EI_1); //显示需检测的图像
//title(mwArray("需检测的图像"));
}
// 设置窗口可见
//SetVisible(h_a,mwArray("On"));
// 进入窗口等待状态
//mlfHGWaitForFiguresToDie();
}
}
}
catch (mwException & ex){
mwDisplayException(ex);
}
}
void CWaterMarkxView::OnDistillOpen()
{
// TODO: Add your command handler code here
//打开检测图像
try{
OpenFileDlg(2); //打开待检测图像
if(!Filename.IsEmpty())
{
Im_filename=mwArray(Filename);
//待检测得图像打开
bdishow=-1;
bcheck=1;
bsave_C=0; //不能保存图像
bsave_I=0;
//EI_1=imread(NULL,NULL,Im_filename); //读取待检测的图像
// subplot(mwArray(2),mwArray(2),mwArray(1));
//确定载体图像的大小
Mc=size(EI_1,mwArray(1));
Nc=size(EI_1,mwArray(2));
mwArray temp=fix( rdivide(Mc,mwArray(blocksize)) );
mwArray temp1=fix(rdivide(Nc,mwArray(blocksize)) );
max_message=times(temp,temp1); //原始图像的最大分块数
//转化为整型
i_Mc=(int)Mc.ExtractScalar(1);
i_Nc=(int)Nc.ExtractScalar(1);
i_max_message=(int)max_message.ExtractScalar(1);
//subplot(mwArray(1),mwArray(1),mwArray(1));
//imshow(EI_1); //显示待检测的图像
//title(mwArray("需检测的图像"));
// 设置窗口可见
//SetVisible(h_a,mwArray("On"));
// 进入窗口等待状态
//mlfHGWaitForFiguresToDie();
}
}
catch (mwException & ex){
mwDisplayException(ex);
}
}
void CWaterMarkxView::OpenFileDlg(int model)
{
CFileDialog fileopenbox(TRUE,"BMP",NULL,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,szFilter);
switch(model)
{
case 0://打开原始图像
fileopenbox.m_ofn.lpstrTitle="打开原始图像";
break;
case 1://打开水印图像
fileopenbox.m_ofn.lpstrTitle="打开水印图像";
break;
case 2://打开代检测图像
fileopenbox.m_ofn.lpstrTitle="打开需检测图像";
break;
case 3:
fileopenbox.m_ofn.lpstrTitle="保存已嵌入水印图像";
// fileopenbox.SetDlgItemText(IDOK,"保存");
break;
case 4:
fileopenbox.m_ofn.lpstrTitle="保存检测水印";
// fileopenbox.SetDlgItemText(IDOK,"保存");
break;
}
if(fileopenbox.DoModal()==IDOK){ //单击“OK”按钮
Filename=fileopenbox.GetPathName(); //得到所选文件的路径名(含文件名)
Filetype=fileopenbox.GetFileExt(); //得到所选文件的扩展名
}
}
mwArray CWaterMarkxView::PSNR(mwArray Im_original,int m,int n, mwArray Im_modified)
{
/* %**************************************************************
%计算峰值信噪比子程序
% 输入: Im_original 原始图像
m 原始图像的行数
n 原始图像的列数
% Im_modified 修改过的图像
% 输出: S 峰值信噪比
% 注:此程序用来计算灰度图像的失真程度
%**************************************************************
*/
mwArray S;
CString str;
if( tobool(size(Im_original)!=size(Im_modified)) )
{
MessageBox("错误:两个输入图像大小不一致!");
return mwArray(-1);
}
//if(tobool(~isrgb(Im_original)&~isrgb(Im_modified)))
if(1)
{
mwArray sumaDif=0.0,temp=0.0;
mwArray mn=times(mwArray(m),mwArray(n));
mwArray maxI=times(mn,max( max( power(Im_original,2) ) ));
int u=0,v=0;
/* for (u=1;u<=m;u++)
{ for (v=1;v<=n;v++)
{
temp=Im_original(mwArray(u),mwArray(v))-Im_modified(mwArray(u),mwArray(v));
sumaDif =sumaDif+power(temp,2);
}
}
*/
temp=Im_original-Im_modified;
sumaDif=sum(sum( power(temp,2) ));
if( tobool( sumaDif==mwArray(0) ) )
sumaDif=mwArray(1.0);
S=rdivide( double_func(maxI),sumaDif);
S=mwArray(10)*log10(S);
return S;
}
else
{
MessageBox("错误:输入图像为彩色图像");
return mwArray(-1);
}
}
mwArray CWaterMarkxView::Similar(mwArray Im_original,mwArray Im_modified)
{
/* %**************************************************************
%计算;两个矢量的相似度子程序
% 输入: Im_original 原始图像
% Im_modified 修改过的图像
% 输出: sim 相似度
% 注:此程序用来计算两个矢量的相似度,通过相似度可以判定水印是否存在
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -