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

📄 wvlttrans.cpp

📁 一种图像水印加密算法 该算法抗攻击性强 安全性高 可以直接运行
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}

//为指定目录下的所有bmp图像加载二值水印
void CWvltTrans::loadWaterMarkToLib(CString bmpPath)
{    
	CString Path = bmpPath + "\\加水印后图像\\" ;//保存加载水印后的图像路径
	CString CoeffChoosedSavePath = Path + "选择的系数\\" ;
	CString libRoot = bmpPath + "\\*.bmp";	    

	CFileFind findch1;
	BOOL bfindresult = findch1.FindFile(libRoot);
	while(bfindresult )//目录下有BMP文件
	{
		bfindresult = findch1.FindNextFile();//下一个文件
		CString CurrentFile = findch1.GetFilePath();
		int pos = CurrentFile.ReverseFind('\\');	
		picName = CurrentFile.Mid(pos+1);//取到当前文件名		
        SavePath = Path + picName;
		if (!ReadBitmap(CurrentFile, m_pBitmap))
		{
			AfxMessageBox("读取原始文件" + CurrentFile + "错误!");
			break;
		}
		//分配缓冲区
		pY = new float* [biHeight];
		pU = new float* [biHeight];
		pV = new float* [biHeight];
		
		for(int i = 0; i < biHeight; i ++)
		{
			pY[i] = new float [biWidth];
			pU[i] = new float [biWidth];
			pV[i] = new float [biWidth];
			
		}
		RGBToYUV(m_pBitmap,pY,pU, pV);//将原始图像数据分解成Y、U、V,此函数中为PY、PU、PV分配内存
		
		int pos2 = picName.ReverseFind('.');	 
        CString picTitle = picName.Left(pos2);//不含扩展名的文件名	
		int x,y;
		float **spTransData0, **spTransData1;
		
		//分配图像小波变换的数据内存空间		
		spTransData0 = new float* [biHeight];
		spTransData1 = new float* [biHeight];
		m_WvltCoeff	= new float * [biHeight];//存放小波变换后系数		
		for(i = 0; i < biHeight; i ++)
		{		
			spTransData0[i] = new float [biWidth];
			spTransData1[i] = new float [biWidth];
			m_WvltCoeff[i] = new float [biWidth];
			
		}		
		//完成图像的三次小波变换
		DWT_nLayers(pY,spTransData0,spTransData1,biHeight,biHeight/2,biWidth,biWidth/2,3,(float)1.414);
		//得到小波系数的极大值和极小值
		for( y=0; y<biHeight; y++)
		{
			for( x=0; x<biWidth; x++)
			{				
				m_WvltCoeff[y][x] = spTransData1[y][x];//得到三次小波变换后的系数
			}
		}
		//为DWT各子带及选择的加载水印的系数、加载水印后的系数及小波逆变换后的系数分配缓冲区
		allocBuffers();
		ChooseCoeffByWholeThreshold();//选择要加载水印的系数,此函数中将小波变换后系数分成各子带
		//将当前图像的选定系数写到文件中,每个文件名对应一个选定系数		
		CString strFilePath =  CoeffChoosedSavePath + picTitle + ".txt";
		WriteFile(strFilePath,CoeffChoosed,biHeight,biWidth);//(大部分值为0)
		
	   // p[nfile].CoeffChoosed = pic.CoeffChoosed;	
		//保存当前图像的图像名-嵌入位置结构体MAP		
//		MAP_PicName_LoadPlace.insert(pair<CString,picture>(picTitle,pic));
		//nfile++;
        
		LoadWaterMark();//加载二值水印
		//对加载过水印的系数进行小波逆变换
		DWT_Inverse(biHeight,biWidth,3,CoeffAfterLoad,CoeffIDWT);
		unsigned char* RGBData = new BYTE [biHeight*biAlign];
		if(RGBData == NULL)
		{
			AfxMessageBox("分配存放合成Y、U、V后的RGB空间失败!");
			return;
		}
		YUVToRGB(CoeffIDWT,pU,pV,RGBData,biHeight,biWidth,biAlign);//恢复加载水印后图像为彩色图像
		FileSaveAs(SavePath,BFH,BIH,RGBData,bmSize);//将加载水印后的数据另存为bmp图像
		
		delete []RGBData;
		RGBData = NULL;			
		freeBuffers();
		//释放空间
		for(i = 0; i < biHeight; i++)
		{
			delete []m_WvltCoeff[i];
			delete []spTransData0[i] ;
			delete []spTransData1[i] ;
			m_WvltCoeff[i] = NULL;
			spTransData0[i] = NULL;
			spTransData1[i] = NULL;
			
		}
		delete []m_WvltCoeff;
		delete []spTransData0;
		delete []spTransData1;		
		spTransData0 = NULL;
		spTransData1 = NULL;
		m_WvltCoeff = NULL;
       
		if( m_pBitmap != NULL)
		{
			delete []m_pBitmap;
			m_pBitmap = NULL;
		}
		
		for(i=0; i<biHeight; i++)
		{			
			delete []pY[i];
			delete []pU[i];
			delete []pV[i];				
			pY[i] = NULL;
			pU[i] = NULL;
			pV[i] = NULL;
		}
		
		delete []pY;
		delete []pU;
		delete []pV;		
		pY = NULL;
		pU = NULL;
		pV = NULL;
		
	}//end while	
		
	findch1.Close();
	AfxMessageBox("所有图像加载水印完毕!");	

}

//为DWT各子带及水印所用缓冲区分配内存
void CWvltTrans::allocBuffers()
{    
	LL1 = new float* [biHeight];//只进行一层变换时用
	LL2 = new float* [biHeight];//进行两层小波变换时用
	LL3 = new float* [biHeight];
	LH1 = new float* [biHeight];
	LH2 = new float* [biHeight];
	LH3 = new float* [biHeight];
	HL1 = new float* [biHeight];
	HL2 = new float* [biHeight];
	HL3 = new float* [biHeight];
	HH1 = new float* [biHeight];
	HH2 = new float* [biHeight];
	HH3 = new float* [biHeight];

	CoeffAfterLoad = new float* [biHeight];//存放加载水印后的系数
	CoeffIDWT = new float* [biHeight];//3层小波逆变换后的系数
	CoeffChoosed = new float* [biHeight];//存放选出的待加载水印的系数

//	pic.CoeffChoosed = new float* [biHeight];//存放选出的待加载水印的系数,此系数在加载水印时被修改了

	//WaterMarkOrigin = new int [MarkLength];//一维数组,存放原始水印信息(二值信息)

	
	for(int i = 0; i < biHeight; i ++)
	{
		LL1[i] = new float [biWidth];
		LL2[i] = new float [biWidth];
		LL3[i] = new float [biWidth];
		LH1[i] = new float [biWidth];
		LH2[i] = new float [biWidth];
		LH3[i] = new float [biWidth];
		HL1[i] = new float [biWidth];
		HL2[i] = new float [biWidth];
		HL3[i] = new float [biWidth];
		HH1[i] = new float [biWidth];
		HH2[i] = new float [biWidth];
		HH3[i] = new float [biWidth];

		CoeffChoosed[i] = new float [biWidth];
		CoeffAfterLoad[i] = new float [biWidth];
		CoeffIDWT[i] = new float [biWidth];

	}

}

void CWvltTrans::freeBuffers()
{
	
	for(int i = 0; i < biHeight; i ++)
	{
		delete []LL1[i] ;
		delete []LL2[i] ;
		delete []LL3[i] ;
		delete []LH1[i] ;
		delete []LH2[i] ;
		delete []LH3[i] ;
		delete []HL1[i] ;
		delete []HL2[i] ;
		delete []HL3[i] ;
		delete []HH1[i] ;
		delete []HH2[i] ;
		delete []HH3[i] ;

		delete []CoeffAfterLoad[i];
		delete []CoeffIDWT[i];
		LL1[i] = NULL;
		LL2[i] = NULL;
		LL3[i] = NULL;
		LH1[i] = NULL;
		LH2[i] = NULL;
		LH3[i] = NULL;
		HL1[i] = NULL;
		HL2[i] = NULL;
		HL3[i] = NULL;
		HH1[i] = NULL;
		HH2[i] = NULL;
		HH3[i] = NULL;

		CoeffAfterLoad[i] = NULL;
		CoeffIDWT[i] = NULL;
	}

	delete []CoeffAfterLoad;
	delete []CoeffIDWT;
	delete []LL1 ;
	delete []LL2 ;
	delete []LL3 ;
	delete []LH1 ;
	delete []LH2 ;
	delete []LH3 ;
	delete []HL1 ;
	delete []HL2 ;
	delete []HL3 ;
	delete []HH1 ;
	delete []HH2 ;
	delete []HH3 ;
	LL1 = NULL;
	LL2 = NULL;
	LL3 = NULL;
	LH1 = NULL;
	LH2 = NULL;
	LH3 = NULL;
	HL1 = NULL;
	HL2 = NULL;
	HL3 = NULL;
	HH1 = NULL;
	HH2 = NULL;
	HH3 = NULL;

	CoeffAfterLoad = NULL;
	CoeffIDWT = NULL;


}
//将系数分割为各子带系数
void CWvltTrans::CoeffPartition()
{
	//allocBuffers();
	//为各子带系数数组赋初值
	for(int i=0; i<biHeight; i++)
	{
		for(int j=0; j<biWidth; j++)
		{
	        LL1[i][j] = 0.0;
		    LL2[i][j] = 0.0;
		    LL3[i][j] = 0.0;
		    LH1[i][j] = 0.0;
		    LH2[i][j] = 0.0;
		    LH3[i][j] = 0.0;
		    HL1[i][j] = 0.0;
		    HL2[i][j] = 0.0;
		    HL3[i][j] = 0.0;
		    HH1[i][j] = 0.0;
		    HH2[i][j] = 0.0;
		    HH3[i][j] = 0.0;

		}

	}
	if(layer = 3)
	{
		for(int i=0; i<biHeight; i++)//控制行
		{
			for(int j=0; j<biWidth; j++)//控制列
			{
				if(i< (biHeight>>layer))
				{
					if(j< (biWidth>>layer))
					{
						LL3[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带,10.10有错?
					}
					else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
					{
						HL3[i][j] = m_WvltCoeff[i][j];
					}
					else if(j> (biWidth>>(layer-1))-1 && j< biWidth>>(layer-2))
					{
						HL2[i][j] = m_WvltCoeff[i][j];
					}
					else
					{
						HL1[i][j] = m_WvltCoeff[i][j];
					}
				}
				else if( i> (biHeight>>layer)-1 && i< biHeight>>(layer-1) )
				{
					if(j< (biWidth>>layer))
					{
						LH3[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
					}
					else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
					{
						HH3[i][j] = m_WvltCoeff[i][j];
					}
					else if(j> (biWidth>>(layer-1))-1 && j< biWidth>>(layer-2))
					{
						HL2[i][j] = m_WvltCoeff[i][j];
					}
					else
					{
						HL1[i][j] = m_WvltCoeff[i][j];
					}
				}
				else if(i> (biHeight>>(layer-1))-1 && i< biHeight>>(layer-2))
				{
					if(j < biWidth>>(layer-1))
					{
						LH2[i][j] = m_WvltCoeff[i][j];
					}
					else if(j > (biWidth>>(layer-1))-1 && j < biWidth>>(layer-2))
					{
						HH2[i][j] = m_WvltCoeff[i][j];
					}
					else
					{
						HL1[i][j] = m_WvltCoeff[i][j];
					}

				}
				else
				{
					if(j < biWidth>>(layer-2))
					{
						LH1[i][j] = m_WvltCoeff[i][j];
					}
					else
					{
						HH1[i][j] = m_WvltCoeff[i][j];
					}
				}
			}
			
		}
	}
	else if(layer = 2)
	{
		for(int i=0; i<biHeight; i++)//控制行
		{
			for(int j=0; j<biWidth; j++)//控制列
			{
				if(i< (biHeight>>layer))
				{
					if(j< (biWidth>>layer))
					{
						LL2[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
					}
					else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
					{
						HL2[i][j] = m_WvltCoeff[i][j];
					}					
					else
					{
						HL1[i][j] = m_WvltCoeff[i][j];
					}
				}
				else if( i> (biHeight>>layer)-1 && i< biHeight>>(layer-1) )
				{
					if(j< (biWidth>>layer))
					{
						LH2[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
					}
					else if( j>(biWidth>>layer)-1 && j< biWidth>>(layer-1) )
					{
						HH2[i][j] = m_WvltCoeff[i][j];
					}
					else
					{
						HL1[i][j] = m_WvltCoeff[i][j];
					}
				}
				else
				{
					if(j < biWidth>>(layer-1))
					{
						LH1[i][j] = m_WvltCoeff[i][j];
					}
					else
					{
						HH1[i][j] = m_WvltCoeff[i][j];
					}
				}
			}
			
		}

	}
	else if(layer = 1)
	{
		for(int i=0; i<biHeight; i++)//控制行
		{
			for(int j=0; j<biWidth; j++)//控制列
			{
				if(i< (biHeight>>layer))
				{
					if(j< (biWidth>>layer))
					{
						LL1[i][j] = m_WvltCoeff[i][j];//将变换后的系数保存到各个子带
					}									
					else
					{
						HL1[i][j] = m_WvltCoeff[i][j];
					}
				}				
				else
				{
					if(j < biWidth>>layer)
					{

⌨️ 快捷键说明

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