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

📄 infohidedoc.cpp

📁 基于混沌系统的图像加密算法
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// InfoHideDoc.cpp : implementation of the CInfoHideDoc class
//

#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "InfoHide.h"
#include "InfoHideDoc.h"
#include "typechoice.h"
#include "input_mw.h"
#include "jm_pic.h"
#include "bmptojpeg2k.h"
#include "video_par.h"
//yuhuan 2008-10-13 add new dialog
#include "Arnold.h"
#include "Lorenz.h"
#include "Liu.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc

IMPLEMENT_DYNCREATE(CInfoHideDoc, CDocument)

BEGIN_MESSAGE_MAP(CInfoHideDoc, CDocument)
	//{{AFX_MSG_MAP(CInfoHideDoc)
	ON_COMMAND(ID_ARNOLD_Z, OnArnoldZ)
	ON_COMMAND(ID_ARNOLD_N, OnArnoldN)
	ON_COMMAND(ID_HILBERT_Z, OnHilbertZ)
	ON_COMMAND(ID_HILBERT_N, OnHilbertN)
	ON_COMMAND(ID_DCT_Z, OnDctZ)
	ON_COMMAND(ID_DCT_N, OnDctN)
	ON_COMMAND(ID_LSB_E, OnLsbE)
	ON_COMMAND(ID_LSB_D, OnLsbD)
	ON_COMMAND(ID_BMP2JPEG, OnBmp2jpeg)
	ON_COMMAND(ID_RGBTOGRAY, OnRgbtogray)
	ON_COMMAND(ID_RGBTO2, OnRgbto2)
	ON_COMMAND(ID_RGBTO256, OnRgbto256)
	ON_COMMAND(ID_VIDEO_PAR, OnVideoPar)
	ON_COMMAND(ID_ROBERT, OnRobert)
	ON_COMMAND(ID_SOBE, OnSobe)
	ON_COMMAND(ID_LAPLACE, OnLaplace)
	ON_COMMAND(ID_LORENZ_DECODE, OnLorenzDecode)
	ON_COMMAND(ID_LORENZ_ENCODE, OnLorenzEncode)
	ON_COMMAND(ID_LIU_ENCODE, OnLiuEncode)
	ON_COMMAND(ID_LIU_DECODE, OnLiuDecode)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc construction/destruction

CInfoHideDoc::CInfoHideDoc()
{
	// TODO: add one-time construction code here
	lpbits=NULL;
	lpbmi=NULL;
	mm_lpbits=NULL;
	trans=0;
	pic_save=0;
}

CInfoHideDoc::~CInfoHideDoc()
{
	free(DataR);
	free(Datas);
}

BOOL CInfoHideDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc serialization

void CInfoHideDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc diagnostics

#ifdef _DEBUG
void CInfoHideDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CInfoHideDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CInfoHideDoc commands

void CInfoHideDoc::OnDraw(CDC *pDC)//在客户区DC上面画出位图
{
	if(!trans){
		::StretchDIBits(pDC->GetSafeHdc(),0,0,m_size.cx,m_size.cy,0,0,m_size.cx,m_size.cy,lpbits,lpbmi,DIB_RGB_COLORS,SRCCOPY);
		pic_save=0;
	}
	else{ 
		::StretchDIBits(pDC->GetSafeHdc(),0,0,mm_m_size.cx,mm_m_size.cy,0,0,mm_m_size.cx,mm_m_size.cy,mm_lpbits,mm_lpbmi,DIB_RGB_COLORS,SRCCOPY);
		trans=0;
		pic_save=1;
	}
}

BOOL CInfoHideDoc::OnOpenDocument(LPCTSTR lpszPathName)//打开位图并判断是否为24位位图 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;//判断路径是否合法

	CFile fp;//指定的位图文件
	fp.Open(lpszPathName,CFile::modeRead);

	fp.Read((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));
	if(bmh.bfType!=0x4D42)//判断文件是否为位图
	{
		AfxMessageBox("不是合法的文件!");
		fp.Close();
		return FALSE;
	}
	mm_bmh=bmh;

	DWORD dwBitsSize=bmh.bfSize;
	lpbmi=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-sizeof(BITMAPFILEHEADER));

	fp.Read(lpbmi,dwBitsSize-sizeof(BITMAPFILEHEADER));
	
	mm_lpbmi=lpbmi;
	if((lpbmi->bmiHeader.biBitCount!=24)||(lpbmi->bmiHeader.biCompression!=BI_RGB))
	{//判断该位图是否为24位非压缩位图
		AfxMessageBox("该位图不是我们需要的24位位图!");
		GlobalFreePtr(lpbmi);
		lpbmi=NULL;
		fp.Close();
		return FALSE;
	}

	lpbits=(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER);

	m_size.cx=lpbmi->bmiHeader.biWidth;//得到位图宽度
	m_size.cy=lpbmi->bmiHeader.biHeight;//得到位图高度
	
	fp.Close();//关闭文件

	return TRUE;
}

BOOL CInfoHideDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
	// TODO: Add your specialized code here and/or call the base class
	CFile fp;//指定文件
	
	fp.Open(lpszPathName,CFile::modeWrite|CFile::modeCreate);
	if(!pic_save)
	{
		fp.Write((LPSTR)&bmh,sizeof(BITMAPFILEHEADER));//写位图头信息
		fp.Write(lpbmi,bmh.bfSize-sizeof(BITMAPFILEHEADER));//写位图数据信息
	}
	else
	{
		fp.Write((LPSTR)&mm_bmh,sizeof(BITMAPFILEHEADER));//写位图头信息
		fp.Write(mm_lpbmi,mm_bmh.bfSize-sizeof(BITMAPFILEHEADER));//写位图数据信息
	}
	fp.Close();
	SetModifiedFlag(false);
	return true;
}
//响应菜单项上的各种具体的算法
/***************************************************************
*ProcessName:二维混沌系统猫映射正变换
***************************************************************/
void CInfoHideDoc::OnArnoldZ() 
{    
    CArnold  dlg;
	//默认值
	dlg.m_npara1=1;//参数1
	dlg.m_npara2=1;//参数2
	dlg.m_npara3=1;//变换次数
    dlg.DoModal();
	int a,b;
	int n;
	a=dlg.m_npara1;//参数1
	b=dlg.m_npara2;//参数2
	n=dlg.m_npara3;//变换次数

	// TODO: Add your command handler code here
	int i,j,*pbuffer;
	pbuffer=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER 
	for (int k=1;k<=n;k++)
	{for(i=0;i<m_size.cy;i++)
	for(j=0;j<m_size.cx;j++)
	{
		pbuffer[(i*m_size.cx+j)*3]=lpbits[(i*m_size.cx+j)*3];
		pbuffer[(i*m_size.cx+j)*3+1]=lpbits[(i*m_size.cx+j)*3+1];
		pbuffer[(i*m_size.cx+j)*3+2]=lpbits[(i*m_size.cx+j)*3+2];
	}//保存原始图像数据
	//猫映射的原理见笔记,其中的m_size.cy就是N
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			lpbits[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3]
				=pbuffer[(i*m_size.cx+j)*3];
			lpbits[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+1]
				=pbuffer[(i*m_size.cx+j)*3+1];
			lpbits[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+2]
				=pbuffer[(i*m_size.cx+j)*3+2];
		}
	}
	
	//进行ARNOLD正变换,并将变换后的数据还原为位图数据
	free(pbuffer);
	pbuffer=NULL;
	UpdateAllViews(NULL);
	SetModifiedFlag();
}
/***************************************************************
*ProcessName:二维混沌系统猫映射逆变换
***************************************************************/
void CInfoHideDoc::OnArnoldN() 
{
	// TODO: Add your command handler code here
	CArnold  dlg;
	//默认值
	dlg.m_npara1=1;//参数1
	dlg.m_npara2=1;//参数2
	dlg.m_npara3=1;//变换次数
    dlg.DoModal();
	int a,b;
	int n;
	a=dlg.m_npara1;
	b=dlg.m_npara2;
	n=dlg.m_npara3;

	int i,j,*pbuffer;
	pbuffer=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER 
	for (int l=1;l<=n;l++)
	{for(i=0;i<m_size.cy;i++)
	for(j=0;j<m_size.cx;j++)
	{
		pbuffer[(i*m_size.cx+j)*3]=lpbits[(i*m_size.cx+j)*3];
		pbuffer[(i*m_size.cx+j)*3+1]=lpbits[(i*m_size.cx+j)*3+1];
		pbuffer[(i*m_size.cx+j)*3+2]=lpbits[(i*m_size.cx+j)*3+2];
	}//保存原始图像数据
	for(i=0;i<m_size.cy;i++)
		for(j=0;j<m_size.cx;j++)
		{
			lpbits[(i*m_size.cx+j)*3]
				=pbuffer[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3];	
			lpbits[(i*m_size.cx+j)*3+1]
				=pbuffer[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+1];
			lpbits[(i*m_size.cx+j)*3+2]
				=pbuffer[(((i+a*j)%m_size.cy)*m_size.cx+(b*i+(a*b+1)*j)%m_size.cy)*3+2];
		}//进行ARNOLD逆变换,
	}
   //进行ARNOLD逆变换,并将变换后的数据还原为位图数据
	free(pbuffer);
	pbuffer=NULL;
	UpdateAllViews(NULL);
	SetModifiedFlag();
}
/***************************************************************
*ProcessName:希尔伯特正变换
***************************************************************/
void CInfoHideDoc::OnHilbertZ() 
{
	// TODO: Add your command handler code here
	ah=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER 
	bh=new int[m_size.cx*m_size.cy*3];
	th=0;
	nh=m_size.cx;
	for(ih=0;ih<m_size.cy;ih++)
		for(jh=0;jh<m_size.cx;jh++)
		{
			ah[(ih*m_size.cx+jh)*3]=lpbits[(ih*m_size.cx+jh)*3];
			ah[(ih*m_size.cx+jh)*3+1]=lpbits[(ih*m_size.cx+jh)*3+1];
			ah[(ih*m_size.cx+jh)*3+2]=lpbits[(ih*m_size.cx+jh)*3+2];
		}//存储位图数据
	ih=nh-1;jh=0;//初始化正变换数据
	h2(nh);
	for(ih=0;ih<m_size.cy;ih++)
		for(jh=0;jh<m_size.cx;jh++)
		{
			lpbits[(ih*m_size.cx+jh)*3]=bh[(ih*m_size.cx+jh)*3];
			lpbits[(ih*m_size.cx+jh)*3+1]=bh[(ih*m_size.cx+jh)*3+1];
			lpbits[(ih*m_size.cx+jh)*3+2]=bh[(ih*m_size.cx+jh)*3+2];
		}//进行HILBERT正变换
	th=0;//还原变换初始位置
	free(ah);
	free(bh);
	ah=NULL;
	bh=NULL;
	UpdateAllViews(NULL);
	SetModifiedFlag();
}
/***************************************************************
*ProcessName:希尔伯特逆变换
***************************************************************/
void CInfoHideDoc::OnHilbertN() 
{
	// TODO: Add your command handler code here
	ah=new int[m_size.cx*m_size.cy*3];//设置中间BUFFER 
	bh=new int[m_size.cx*m_size.cy*3];
	th=0;
	nh=m_size.cx;
	for(ih=0;ih<m_size.cy;ih++)
		for(jh=0;jh<m_size.cx;jh++)
		{
			ah[(ih*m_size.cx+jh)*3]=lpbits[(ih*m_size.cx+jh)*3];
			ah[(ih*m_size.cx+jh)*3+1]=lpbits[(ih*m_size.cx+jh)*3+1];
			ah[(ih*m_size.cx+jh)*3+2]=lpbits[(ih*m_size.cx+jh)*3+2];
		}//存储位图数据
	ih=nh-1;jh=0;//初始化逆变换数据
	fh2(nh);
	for(ih=0;ih<m_size.cy;ih++)
		for(jh=0;jh<m_size.cx;jh++)
		{
			lpbits[(ih*m_size.cx+jh)*3]=bh[(ih*m_size.cx+jh)*3];
			lpbits[(ih*m_size.cx+jh)*3+1]=bh[(ih*m_size.cx+jh)*3+1];
			lpbits[(ih*m_size.cx+jh)*3+2]=bh[(ih*m_size.cx+jh)*3+2];
		}//进行HILBERT逆变换
	th=0;//还原变换初始位置
	free(ah);
	free(bh);
	ah=NULL;
	bh=NULL;
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CInfoHideDoc::h1(int step)//HILBERT正变换方向一
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(++jh))*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((--ih)*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(--jh))*3];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(++jh))*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((--ih)*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(--jh))*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(++jh))*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((--ih)*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(--jh))*3+2];
	}
	else{
	h2(step/2);
	jh++; h1(step/2);
	ih--; h1(step/2);
	jh--; h3(step/2);
	}
}

void CInfoHideDoc::h2(int step)//HILBERT正变换方向二
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((--ih)*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(++jh))*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((++ih)*m_size.cx+jh)*3];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((--ih)*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(++jh))*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((++ih)*m_size.cx+jh)*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((--ih)*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(++jh))*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((++ih)*m_size.cx+jh)*3+2];
	}
	else{
	h1(step/2);
	ih--; h2(step/2);
	jh++; h2(step/2);
	ih++; h4(step/2);
	}
}

void CInfoHideDoc::h3(int step)//HILBERT正变换方向三
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((++ih)*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(--jh))*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((--ih)*m_size.cx+jh)*3];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((++ih)*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(--jh))*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((--ih)*m_size.cx+jh)*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((++ih)*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(--jh))*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((--ih)*m_size.cx+jh)*3+2];
	}
	else{
	h4(step/2);
	ih++; h3(step/2);
	jh--; h3(step/2);
	ih--; h1(step/2);
	}
}

void CInfoHideDoc::h4(int step)//HILBERT正变换方向四
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(--jh))*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[((++ih)*m_size.cx+jh)*3];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3]=ah[(ih*m_size.cx+(++jh))*3];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(--jh))*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[((++ih)*m_size.cx+jh)*3+1];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+1]=ah[(ih*m_size.cx+(++jh))*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(--jh))*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[((++ih)*m_size.cx+jh)*3+2];
	bh[((th/nh)*m_size.cx+((th++)%nh))*3+2]=ah[(ih*m_size.cx+(++jh))*3+2];
	}
	else{
	h3(step/2);
	jh--; h4(step/2);
	ih++; h4(step/2);
	jh++; h2(step/2);
	}
}

void CInfoHideDoc::fh1(int step)//HILBERT逆变换方向一
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[(ih*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[(ih*m_size.cx+(++jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[((--ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[(ih*m_size.cx+(--jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[(ih*m_size.cx+(++jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[((--ih)*m_size.cx+jh)*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];
	bh[(ih*m_size.cx+(--jh))*3+1]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+1];

	ih=var_i;jh=var_j;th=var_t;
	bh[(ih*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[(ih*m_size.cx+(++jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[((--ih)*m_size.cx+jh)*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	bh[(ih*m_size.cx+(--jh))*3+2]=ah[((th/nh)*m_size.cx+((th++)%nh))*3+2];
	}
	else{
	fh2(step/2);
	jh++; fh1(step/2);
	ih--; fh1(step/2);
	jh--; fh3(step/2);
	}
}

void CInfoHideDoc::fh2(int step)//HILBERT逆变换方向二
{
	int var_i,var_j,var_t;
	var_i=ih;var_j=jh;var_t=th;
	if(step==2){
	bh[(ih*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[((--ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[(ih*m_size.cx+(++jh))*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];
	bh[((++ih)*m_size.cx+jh)*3]=ah[((th/nh)*m_size.cx+((th++)%nh))*3];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -