⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpsystemview.cpp

📁 在充分研究了原有的二值图像加密算法的基础上
💻 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 + -