📄 watermark.cpp
字号:
double psnr;
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if( pDoc->pnOriPic == NULL || pDoc->pnRecOriPic == NULL )
{
AfxMessageBox( "无比较图像的数据!", MB_OK, 0 );
return;
}
int *pO, *pR, t;
pO = pDoc->pnOriPic; // m_pdResData 指向重建图的数据
pR = pDoc->pnRecOriPic ; // m_pdOriData 指向原图数据
psnr = 0.0;
if(pDoc->m_nOriBitCount==8)
{
for( long n=0; n<pDoc->m_nOriWidth*pDoc->m_nOriHeight; n++ )
{
t = (*pR) - (*pO);
psnr += (double)( t*t );
pO++;
pR++;
}
psnr = psnr/((double)pDoc->m_nOriWidth*(double)pDoc->m_nOriHeight);
}
CString str;
if( psnr != 0.0 ) // 信噪比计算有错????????????????
{
psnr = 10*log10( 255.0*255.0/psnr );
str.Format("PSNR: %8.4f\n",psnr);
AfxMessageBox(str,MB_OK,0);
}
else
AfxMessageBox("无损变换");
}
void CImageVisualView::OnToolIntensity()
{
// TODO: Add your command handler code here
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int nSizePic;
nSizePic=pDoc->m_nOriHeight*pDoc->m_nOriWidth;
int i,p;
CDialogIntensity dlgIntensity;
dlgIntensity.m_ndlgSizePic=nSizePic;
dlgIntensity.m_nPicWidth=pDoc->m_nOriWidth;
dlgIntensity.m_nPicHeight=pDoc->m_nOriHeight;
dlgIntensity.m_ndlgBitCount=pDoc->m_nOriBitCount;
for(i=0;i<256;i++)
{
dlgIntensity.m_ndlgNumberPoint[i]=0;
for(p=0;p<3;p++)
dlgIntensity.m_ndlgColorNumber[i][p]=0;
}
if(pDoc->m_nOriBitCount==8)
{
for(i=0;i<nSizePic;i++)
{
dlgIntensity.m_ndlgNumberPoint[*(pDoc->pnOriPic+i)]++;
}
}else if(pDoc->m_nOriBitCount==24)
{
for(i=0;i<nSizePic;i++)
{
for(p=0;p<3;p++)
{
dlgIntensity.m_ndlgColorNumber[*(pDoc->pnOriPic+i*3+p)][p]++;
}
}
}
if(! dlgIntensity.DoModal())
{
AfxMessageBox("对话框打开失败");
}
}
//DEL void CImageVisualView::OnButtonPaint()
//DEL {
//DEL // TODO: Add your control notification handler code here
//DEL CClientDC dlgDC(this);
//DEL
//DEL CPen Pen;
//DEL CPen *OldPen;
//DEL
//DEL Pen.CreatePen (PS_SOLID,1,RGB(0,0,200));
//DEL OldPen=dlgDC.SelectObject (&Pen);
//DEL dlgDC.Rectangle(10,10,400,500);
//DEL }
void CImageVisualView::OnPointInvert()
{
// TODO: Add your command handler code here
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long i,j,l;
long lgSizePicture;
int *pn;
BYTE *pb;
lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
if( pDoc->m_nOriBitCount== 8 )
{
for(i=0;i<lgSizePicture;i++)
{
*(pDoc->pnOriPic+i)=255-*(pDoc->pnOriPic+i);
}
}
else if( pDoc->m_nOriBitCount==24 )
{
for(i=0;i<lgSizePicture;i++)
{
for(int p=0;p<3;p++)
{
*(pDoc->pnOriPic+3*i+p)=255-*(pDoc->pnOriPic+3*i+p);
}
}
}
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
if(pDoc->m_nOriBitCount==24)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
for(l=0;l<3;l++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for l
} //for i
if(((pDoc->m_nOriWidth*3)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
}
}
}else if(pDoc->m_nOriBitCount==8)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for i
if(((pDoc->m_nOriWidth)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
}
}
}
pDoc->pbOriStatic=pb;
pDoc->pnOriPic=pn;
Invalidate();
}
void CImageVisualView::OnPointLiner()
{
// TODO: Add your command handler code here
float fA=2.0;
float fB=-128.0;
CDialogPointLiner dlgPointLiner;
dlgPointLiner.m_ffA=fA;
dlgPointLiner.m_ffB=fB;
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long i,j,l;
long lgSizePicture;
int *pn;
BYTE *pb;
if(dlgPointLiner.DoModal()!=IDOK)
{
return;
}
fA=dlgPointLiner.m_ffA;
fB=dlgPointLiner.m_ffB;
delete dlgPointLiner;
lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
if( pDoc->m_nOriBitCount== 8 )
{
for(i=0;i<lgSizePicture;i++)
{
*(pDoc->pnOriPic+i)=(int)((float)*(pDoc->pnOriPic+i)*fA+fB);
if(*(pDoc->pnOriPic+i)<0)
{
*(pDoc->pnOriPic+i)=0;
}else if(*(pDoc->pnOriPic+i)>255)
{
*(pDoc->pnOriPic+i)=255;
}
}
}
else if( pDoc->m_nOriBitCount==24 )
{
for(i=0;i<lgSizePicture;i++)
{
for(int p=0;p<3;p++)
{
*(pDoc->pnOriPic+3*i+p)=(int)((float)*(pDoc->pnOriPic+3*i+p)*fA+fB);
if(*(pDoc->pnOriPic+3*i+p)<0)
{
*(pDoc->pnOriPic+3*i+p)=0;
}else if(*(pDoc->pnOriPic+3*i+p)>255)
{
*(pDoc->pnOriPic+3*i+p)=255;
}
}
}
}
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
if(pDoc->m_nOriBitCount==24)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
for(l=0;l<3;l++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for l
} //for i
if(((pDoc->m_nOriWidth*3)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
}
}
}else if(pDoc->m_nOriBitCount==8)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for i
if(((pDoc->m_nOriWidth)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
}
}
}
pDoc->pbOriStatic=pb;
pDoc->pnOriPic=pn;
Invalidate();
}
void CImageVisualView::OnPointThresholdTrans()
{
// TODO: Add your command handler code here
int nThre=128;
CDialogPointThreTrans dlgPointThreTrans;
dlgPointThreTrans.m_nThre=nThre;
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long i,j,l;
long lgSizePicture;
int *pn;
BYTE *pb;
if(dlgPointThreTrans.DoModal()!=IDOK)
{
return;
}
nThre=dlgPointThreTrans.m_nThre;
delete dlgPointThreTrans;
lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
if( pDoc->m_nOriBitCount== 8 )
{
for(i=0;i<lgSizePicture;i++)
{
if(*(pDoc->pnOriPic+i)<=nThre)
{
*(pDoc->pnOriPic+i)=0;
}else if(*(pDoc->pnOriPic+i)>nThre)
{
*(pDoc->pnOriPic+i)=255;
}
}
}
else if( pDoc->m_nOriBitCount==24 )
{
for(i=0;i<lgSizePicture;i++)
{
for(int p=0;p<3;p++)
{
if(*(pDoc->pnOriPic+3*i+p)<=nThre)
{
*(pDoc->pnOriPic+3*i+p)=0;
}else if(*(pDoc->pnOriPic+3*i+p)>nThre)
{
*(pDoc->pnOriPic+3*i+p)=255;
}
}
}
}
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
if(pDoc->m_nOriBitCount==24)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
for(l=0;l<3;l++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for l
} //for i
if(((pDoc->m_nOriWidth*3)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
}
}
}else if(pDoc->m_nOriBitCount==8)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for i
if(((pDoc->m_nOriWidth)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
}
}
}
pDoc->pbOriStatic=pb;
pDoc->pnOriPic=pn;
Invalidate();
}
void CImageVisualView::OnImageBake()
{
// TODO: Add your command handler code here
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long i,j,l;
long lgSizePicture;
int *pn;
BYTE *pb;
if(pDoc->m_boolFlag)
{
lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
if( pDoc->m_nOriBitCount== 8 )
{
for(i=0;i<lgSizePicture;i++)
{
*(pDoc->pnOriPic+i)=*(pDoc->pnRecOriPic+i);
}
}
else if( pDoc->m_nOriBitCount==24 )
{
for(i=0;i<lgSizePicture;i++)
{
for(int p=0;p<3;p++)
{
*(pDoc->pnOriPic+3*i+p)=*(pDoc->pnRecOriPic+3*i+p);
}
}
}
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
if(pDoc->m_nOriBitCount==24)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
for(l=0;l<3;l++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for l
} //for i
if(((pDoc->m_nOriWidth*3)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
}
}
}else if(pDoc->m_nOriBitCount==8)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for i
if(((pDoc->m_nOriWidth)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
}
}
}
pDoc->pbOriStatic=pb;
pDoc->pnOriPic=pn;
Invalidate();
}
}
void CImageVisualView::OnPointWinTrans()
{
// TODO: Add your command handler code here
int nThreMax=240;
int nThreMin=20;
CDialogPointWinTrans dlgPointWinTrans;
dlgPointWinTrans.m_nThreMax=nThreMax;
dlgPointWinTrans.m_nThreMin=nThreMin;
CImageVisualDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
long i,j,l;
long lgSizePicture;
int *pn;
BYTE *pb;
if(dlgPointWinTrans.DoModal()!=IDOK)
{
return;
}
nThreMax=dlgPointWinTrans.m_nThreMax;
nThreMin=dlgPointWinTrans.m_nThreMin;
delete dlgPointWinTrans;
lgSizePicture=(long)pDoc->m_nOriHeight*(long)pDoc->m_nOriWidth;
if( pDoc->m_nOriBitCount== 8 )
{
for(i=0;i<lgSizePicture;i++)
{
if(*(pDoc->pnOriPic+i)<nThreMin)
{
*(pDoc->pnOriPic+i)=0;
}else if(*(pDoc->pnOriPic+i)>nThreMax)
{
*(pDoc->pnOriPic+i)=255;
}
}
}
else if( pDoc->m_nOriBitCount==24 )
{
for(i=0;i<lgSizePicture;i++)
{
for(int p=0;p<3;p++)
{
if(*(pDoc->pnOriPic+3*i+p)<nThreMin)
{
*(pDoc->pnOriPic+3*i+p)=0;
}else if(*(pDoc->pnOriPic+3*i+p)>nThreMax)
{
*(pDoc->pnOriPic+3*i+p)=255;
}
}
}
}
pb=pDoc->pbOriStatic;
pn=pDoc->pnOriPic;
if(pDoc->m_nOriBitCount==24)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
for(l=0;l<3;l++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for l
} //for i
if(((pDoc->m_nOriWidth*3)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth*3)%4);
}
}
}else if(pDoc->m_nOriBitCount==8)
{
for(j=0;j<pDoc->m_nOriHeight;j++){
for(i=0;i<pDoc->m_nOriWidth ;i++){
*pDoc->pbOriStatic=(BYTE)*pDoc->pnOriPic;
pDoc->pnOriPic=pDoc->pnOriPic+1;
pDoc->pbOriStatic=pDoc->pbOriStatic+1;
} //for i
if(((pDoc->m_nOriWidth)%4)!=0){ //加入附加字节
pDoc->pbOriStatic=pDoc->pbOriStatic+4-((pDoc->m_nOriWidth)%4);
}
}
}
pDoc->pbOriStatic=pb;
pDoc->pnOriPic=pn;
Invalidate();
}
void CImageVisualView::OnPointGrayStretch()
{
// TODO: Add your command handler code here
int nGrayX1=20;
int nGrayY1=30;
int nGrayX2=100;
int nGrayY2=120;
CDialogPointGrayStretch dlgPointGrayStretch;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -