📄 fpsystemview.cpp
字号:
// FPSystemView.cpp : implementation of the CFPSystemView class
//
#include "stdafx.h"
#include "FPSystem.h"
#include "FPSystemDoc.h"
#include "FPSystemView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//被调用窗口的类文头
#include "KeySetForm.h"
/////////////////////////////////////////////////////////////////////////////
// CFPSystemView
IMPLEMENT_DYNCREATE(CFPSystemView, CView)
BEGIN_MESSAGE_MAP(CFPSystemView, CView)
//{{AFX_MSG_MAP(CFPSystemView)
ON_COMMAND(ID_EDIT_DISARRANGE, OnEditDisarrange)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_EDIT_UNDISARRANGE, OnEditUndisarrange)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFPSystemView construction/destruction
CFPSystemView::CFPSystemView()
{
// TODO: add construction code here
}
CFPSystemView::~CFPSystemView()
{
}
BOOL CFPSystemView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFPSystemView drawing
void CFPSystemView::OnDraw(CDC* pDC)
{
CFPSystemDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(pDoc->m_bmpobject.hBitmap)
{
HDC hMemDC;
hMemDC=CreateCompatibleDC(pDC->m_hDC);
if(pDoc->m_bmpobject.hPalette)
{
SelectPalette(pDC->GetSafeHdc(),pDoc->m_bmpobject.hPalette,FALSE);
SelectPalette(hMemDC,pDoc->m_bmpobject.hPalette,FALSE);
RealizePalette(pDC->GetSafeHdc());
}
SelectObject(hMemDC,pDoc->m_bmpobject.hBitmap);
BitBlt(pDC->GetSafeHdc(),0,0,pDoc->m_bmpobject.bi.biWidth,pDoc->m_bmpobject.bi.biHeight,
hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
}
}
/////////////////////////////////////////////////////////////////////////////
// CFPSystemView printing
BOOL CFPSystemView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFPSystemView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFPSystemView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFPSystemView diagnostics
#ifdef _DEBUG
void CFPSystemView::AssertValid() const
{
CView::AssertValid();
}
void CFPSystemView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFPSystemDoc* CFPSystemView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFPSystemDoc)));
return (CFPSystemDoc*)m_pDocument;
}
#endif //_DEBUG
void CFPSystemView::OnEditDisarrange() //灰度图像置乱
{
// TODO: Add your command handler code here
CFPSystemDoc *pDoc = GetDocument();
HGLOBAL hImgdata = pDoc->m_bmpobject.hImgData;
LPBITMAPINFOHEADER lpImgData = (LPBITMAPINFOHEADER)GlobalLock(hImgdata); //加锁
if(pDoc->m_bmpobject.bi.biClrUsed!=256)
{
MessageBox("目前本版本系统只对256色位图置乱!");
GlobalUnlock(hImgdata); //解锁
return;
}
CKeySetForm form;
if(IDCANCEL==form.DoModal())
{
return;
}
double key1=form.m_dkey1; //密钥1
double key2=form.m_dkey2; //密钥2
double key3=key1+0.01;
double key4=key2+0.001;
DWORD BufSize=(DWORD)(pDoc->m_bmpobject.bf.bfSize-sizeof(BITMAPFILEHEADER)); //hImgData所对应的空间大小
DWORD dataSize=pDoc->m_bmpobject.bf.bfSize-pDoc->m_bmpobject.bf.bfOffBits; //数据区大小
char *data = new char[dataSize];
//将图像数据拷到data数组中
DWORD LineBytes; //BMP图像中一行所需的数据长度
LineBytes = dataSize/pDoc->m_bmpobject.bi.biHeight;
char *lpPtr;
int x,y;
int datanum=0; //用于记录已拷贝的个数
// memcpy(data,lpImgData+(DWORD)(sizeof(BITMAPINFOHEADER)+pDoc->m_bmpobject.bi.biClrUsed*sizeof(RGBQUAD)),dataSize);
for(y=0;y<pDoc->m_bmpobject.bi.biHeight;y++)
{
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<pDoc->m_bmpobject.bi.biWidth;x++)
{
data[datanum]=(char)(*lpPtr++);
datanum++;
}
}
char *tempdata=new char[dataSize];
//精确计时
LARGE_INTEGER litmp;
LONGLONG dwStart,dwEnd;
double dfMinus,dfFreq,dfTime;
::QueryPerformanceFrequency(&litmp); //获得计时器的时钟频率
dfFreq=(double)litmp.QuadPart;
::QueryPerformanceCounter(&litmp);
dwStart=litmp.QuadPart; //开始计时
this->Shuffle(data,LineBytes,pDoc->m_bmpobject.bi.biHeight,tempdata,key1,key2); //混沌置乱算法
this->Shuffle(data,LineBytes,pDoc->m_bmpobject.bi.biHeight,tempdata,key3,key4);
::QueryPerformanceCounter(&litmp);
dwEnd=litmp.QuadPart; //终止计时
dfMinus=(double)(dwEnd-dwStart);
dfTime=dfMinus/dfFreq*1000;
delete []tempdata;
//将图像数据放回hImgData中
datanum=0;
for(y=0;y<pDoc->m_bmpobject.bi.biHeight;y++)
{
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<pDoc->m_bmpobject.bi.biWidth;x++)
{
(*lpPtr++)=data[datanum];
datanum++;
}
}
delete []data;
CDC *pDC=this->GetDC();
HPALETTE hPrevPalette;
if(pDoc->m_bmpobject.hPalette)
{
hPrevPalette=SelectPalette(pDC->m_hDC,pDoc->m_bmpobject.hPalette,FALSE);
RealizePalette(pDC->m_hDC); //将现有逻辑调色板影射到系统调色板
}
if(pDoc->m_bmpobject.hBitmap!=NULL)
{
pDoc->m_bmpobject.hBitmap=NULL;
delete pDoc->m_bmpobject.hBitmap;
}
pDoc->m_bmpobject.hBitmap=CreateDIBitmap(pDC->m_hDC,(LPBITMAPINFOHEADER)lpImgData,(DWORD)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+pDoc->m_bmpobject.bi.biClrUsed*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);
if(pDoc->m_bmpobject.hPalette && hPrevPalette)
{
SelectPalette(pDC->m_hDC,hPrevPalette,FALSE);
RealizePalette(pDC->m_hDC); //将现有逻辑调色板影射到系统调色板
}
Invalidate(FALSE);
CString strShow;
strShow.Format("置乱图像耗时%fms",dfTime);
pDC->TextOut(300,200,strShow);
this->ReleaseDC(pDC);
GlobalUnlock(hImgdata); //解锁
}
void CFPSystemView::OnFileSave()
{
// TODO: Add your command handler code here
CFileDialog saveDlg(FALSE);
saveDlg.m_ofn.lpstrFilter="BMP Files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";
if(IDCANCEL==saveDlg.DoModal())
{
return;
}
CString fileName = saveDlg.GetPathName();
CFPSystemDoc *pDoc = GetDocument();
if(pDoc->m_bmpobject.SaveBmpFile(fileName)==FALSE)
{
return;
}
else
{
MessageBox("图像文件保存成功!");
}
}
void CFPSystemView::OnEditUndisarrange()
{
CFPSystemDoc *pDoc = GetDocument();
HGLOBAL hImgdata = pDoc->m_bmpobject.hImgData;
LPBITMAPINFOHEADER lpImgData = (LPBITMAPINFOHEADER)GlobalLock(hImgdata); //加锁
if(pDoc->m_bmpobject.bi.biClrUsed!=256)
{
MessageBox("目前本版本系统只对256色位图逆置乱!");
GlobalUnlock(hImgdata); //解锁
return;
}
CKeySetForm form;
if(IDCANCEL==form.DoModal())
{
return;
}
double key1=form.m_dkey1; //密钥1
double key2=form.m_dkey2; //密钥2
double key3=key1+0.01;
double key4=key2+0.001;
DWORD BufSize=(DWORD)(pDoc->m_bmpobject.bf.bfSize-sizeof(BITMAPFILEHEADER)); //hImgData所对应的空间大小
DWORD dataSize=pDoc->m_bmpobject.bf.bfSize-pDoc->m_bmpobject.bf.bfOffBits; //数据区大小
char *data = new char[dataSize];
//将图像数据拷到data数组中
DWORD LineBytes; //BMP图像中一行所需的数据长度
LineBytes = dataSize/pDoc->m_bmpobject.bi.biHeight;
char *lpPtr;
int x,y;
int datanum=0; //用于记录已拷贝的个数
for(y=0;y<pDoc->m_bmpobject.bi.biHeight;y++)
{
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<pDoc->m_bmpobject.bi.biWidth;x++)
{
data[datanum]=(char)(*lpPtr++);
datanum++;
}
}
char *tempdata=new char[dataSize];
//精确计时
LARGE_INTEGER litmp;
LONGLONG dwStart,dwEnd;
double dfMinus,dfFreq,dfTime;
::QueryPerformanceFrequency(&litmp); //获得计时器的时钟频率
dfFreq=(double)litmp.QuadPart;
::QueryPerformanceCounter(&litmp);
dwStart=litmp.QuadPart; //开始计时
this->unShuffle(data,LineBytes,pDoc->m_bmpobject.bi.biHeight,tempdata,key3,key4);
this->unShuffle(data,LineBytes,pDoc->m_bmpobject.bi.biHeight,tempdata,key1,key2); //混沌逆置乱指纹图像
::QueryPerformanceCounter(&litmp);
dwEnd=litmp.QuadPart; //终止计时
dfMinus=(double)(dwEnd-dwStart);
dfTime=dfMinus/dfFreq*1000;
delete []tempdata;
//将图像数据放回hImgData中
datanum=0;
for(y=0;y<pDoc->m_bmpobject.bi.biHeight;y++)
{
lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes);
for(x=0;x<pDoc->m_bmpobject.bi.biWidth;x++)
{
(*lpPtr++)=data[datanum];
datanum++;
}
}
delete []data;
CDC *pDC=this->GetDC();
HPALETTE hPrevPalette;
if(pDoc->m_bmpobject.hPalette)
{
hPrevPalette=SelectPalette(pDC->m_hDC,pDoc->m_bmpobject.hPalette,FALSE);
RealizePalette(pDC->m_hDC); //将现有逻辑调色板影射到系统调色板
}
if(pDoc->m_bmpobject.hBitmap!=NULL)
{
pDoc->m_bmpobject.hBitmap=NULL;
delete pDoc->m_bmpobject.hBitmap;
}
pDoc->m_bmpobject.hBitmap=CreateDIBitmap(pDC->m_hDC,(LPBITMAPINFOHEADER)lpImgData,(DWORD)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER)+pDoc->m_bmpobject.bi.biClrUsed*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData,DIB_RGB_COLORS);
if(pDoc->m_bmpobject.hPalette && hPrevPalette)
{
SelectPalette(pDC->m_hDC,hPrevPalette,FALSE);
RealizePalette(pDC->m_hDC); //将现有逻辑调色板影射到系统调色板
}
Invalidate(FALSE); //更新屏幕
CString strShow;
strShow.Format("逆置乱图像耗时%fms",dfTime);
pDC->TextOut(300,200,strShow);
this->ReleaseDC(pDC);
GlobalUnlock(hImgdata); //解锁
}
void CFPSystemView::Shuffle(char *data, int width, int heighth, char *temp, double key1, double key2)
{
int i,j;
double *diedai=new double[width*heighth*8];
diedai[0]=1-key1*key2*key2;
char *xx=new char[width*heighth*8];
if(fabs(diedai[0])>0.5) xx[0]=(char)1;
else xx[0]=(char)0;
for(i=1;i<width*heighth*8;i++)
{
diedai[i]=1-key1*diedai[i-1]*diedai[i-1];
if(fabs(diedai[i])>0.5) xx[i]=(char)1;
else xx[i]=(char)0;
}
delete []diedai;
char *X=new char[width*heighth];
for(i=0;i<width*heighth;i++)
{
X[i]=(char)0;
for(j=0;j<8;j++)
{
X[i] += xx[i*8+j]<<j;
}
temp[i]=X[i]^data[i];
}
memcpy(data,temp,width*heighth);
delete []xx;
delete []X;
}
void CFPSystemView::unShuffle(char *data, int width, int heighth, char *temp, double key1, double key2)
{
int i,j;
double *diedai=new double[width*heighth*8];
diedai[0]=1-key1*key2*key2;
char *xx=new char[width*heighth*8];
if(fabs(diedai[0])>0.5) xx[0]=(char)1;
else xx[0]=(char)0;
for(i=1;i<width*heighth*8;i++)
{
diedai[i]=1-key1*diedai[i-1]*diedai[i-1];
if(fabs(diedai[i])>0.5) xx[i]=(char)1;
else xx[i]=(char)0;
}
delete []diedai;
char *X=new char[width*heighth];
for(i=0;i<width*heighth;i++)
{
X[i]=(char)0;
for(j=0;j<8;j++)
{
X[i] += xx[i*8+j]<<j;
}
temp[i]=X[i]^data[i];
}
memcpy(data,temp,width*heighth);
delete []xx;
delete []X;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -