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

📄 extracted.cpp

📁 一个实用的水印加密解密程序
💻 CPP
字号:
// Extracted.cpp : implementation file
//

#include "stdafx.h"
#include "WaterMark.h"
#include "Extracted.h"
#include "Dib.h"
#include "Embed.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CExtracted dialog


CExtracted::CExtracted(CWnd* pParent /*=NULL*/)
	: CDialog(CExtracted::IDD, pParent)
{
	//{{AFX_DATA_INIT(CExtracted)
	m_height = 0;
	m_width = 0;
	//}}AFX_DATA_INIT
	show[0]=show[1]=FALSE;
	m_hwnd[0]=m_hwnd[1]=NULL;
	hSrcDC[0]=hSrcDC[1]=hDesDC[0]=hDesDC[1]=NULL;
	m_dib = new CDib();
	ImageHeight=ImageWidth=0;


}


void CExtracted::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CExtracted)
	DDX_Text(pDX, IDC_EDIT1, m_height);
	DDX_Text(pDX, IDC_EDIT2, m_width);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CExtracted, CDialog)
	//{{AFX_MSG_MAP(CExtracted)
	ON_BN_CLICKED(IDC_BUTTON1, OnEmbedImage)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON3, OnSaveExtracted)
	ON_BN_CLICKED(IDC_BUTTON4, OnClearImage)
	ON_BN_CLICKED(IDC_BUTTON2, OnExtracted)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExtracted message handlers

void CExtracted::OnEmbedImage() 
{
	// TODO: Add your control notification handler code here
		CFileDialog dlg(TRUE, "", NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, "(*.bmp)|*.bmp|所有文件(*.*)|*.*||",AfxGetMainWnd());
	//读取图象的文件名CString Imagefilename;
	if(dlg.DoModal()==IDOK)
	{
	//POSITION pos = dlg.GetStartPosition();
//	ImageFilename = dlg.GetNextPathName(pos);
	WaterEmbedFilename=dlg.GetPathName();
	GetWaterEmbedData();
    if(m_hwnd[0]!=NULL)
	  m_hwnd[0]=NULL;
  if(hSrcDC[0]!=NULL)
	  hSrcDC[0]=NULL;
  if(hDesDC[0]!=NULL)
	  hDesDC[0]=NULL;
 m_hwnd[0]=GetDlgItem(IDC_STATIC4);
  hDesDC[0]=m_hwnd[0]->GetDC()->m_hDC;
  hSrcDC[0]=CreateCompatibleDC(hDesDC[0]);
 // ImageFilename=dlg.GetPathName();
hBitmap[0]=(HBITMAP)LoadImage(AfxGetInstanceHandle(),WaterEmbedFilename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
  GetObject(hBitmap[0],sizeof(BITMAP),&bm[0]);
  SelectObject(hSrcDC[0],hBitmap[0]);
  m_hwnd[0]->GetClientRect(&rect[0]);
  ::SetStretchBltMode(hDesDC[0],COLORONCOLOR);
  ::StretchBlt(hDesDC[0],rect[0].left,rect[0].top,rect[0].right,rect[0].bottom,hSrcDC[0],0,0,bm[0].bmWidth,bm[0].bmHeight,+SRCCOPY);
   show[0]=TRUE;
 
   SetTimer(NULL,50,0);
   GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
   //************************************************
   
 	CString s,s0,s1;
	biBitCount=m_dib->GetBiBitCount();
    m_edit=new CEdit;
	s.Format("%2d",ImageHeight);
	s1.Format("%2d",ImageWidth);
	s0.Format("%d",biBitCount);
	str="嵌入水印图象:"+s0+"位H×W:"+s+"X"+s1;
   r.left=20;
   r.right=r.left+200;
   r.top=rect[0].bottom+30;
   r.bottom=r.top+20;
  ShowText(str,r,m_edit);

	}
}
void CExtracted::GetWaterEmbedData()
{
	int i,j;	
	if(m_WaterEmbedData1 !=NULL)
			for(i=0; i<ImageHeight; i++)
				delete [] m_WaterEmbedData1[i];			
	if(WaterEmbedFilename.GetLength()==0)
	{
		MessageBox("请打开文件!");
		return ;
	}	
	m_dib->Open(WaterEmbedFilename);

	ImageWidth = m_dib->GetWidth();
	ImageHeight = m_dib->GetHeight();
	biBitCount = m_dib->GetBiBitCount(); 

	BYTE  *Imagedata;
	Imagedata =(BYTE *) m_dib->m_pDibBits;
	int byteBitCount=m_dib->GetBiBitCount()/8;

    m_WaterEmbedData1 =new RGBQUAD*[ImageHeight];
	
	for (int m=0;m<ImageHeight;m++)
    m_WaterEmbedData1[m]=new RGBQUAD [ImageWidth];
	
	int count = 0;
	int num = 0;
	for(i=ImageHeight-1; i>=0; i--)
	{
		for(j=0; j<ImageWidth; j++)
		{
		m_WaterEmbedData1[i][j].rgbBlue=Imagedata[count++];
		m_WaterEmbedData1[i][j].rgbGreen=Imagedata[count++];
		m_WaterEmbedData1[i][j].rgbRed=Imagedata[count++];
		m_WaterEmbedData1[i][j].rgbReserved=0;
			count += byteBitCount-3;
			num+=1;
		}
		count += (4-(ImageWidth*byteBitCount)%4)%4;		
	}

}

void CExtracted::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	    if (show[0])
		{
			::StretchBlt(hDesDC[0], rect[0].left, rect[0].top, rect[0].right, \
				rect[0].bottom, hSrcDC[0], 0, 0, bm[0].bmWidth, bm[0].bmHeight,+SRCCOPY);
		}
	
		if (show[1])
		{
			::StretchBlt(hDesDC[1], rect[1].left, rect[1].top, rect[1].right, \
				rect[1].bottom, hSrcDC[1], 0, 0, bm[1].bmWidth, bm[1].bmHeight,+SRCCOPY);
		}
	CDialog::OnTimer(nIDEvent);
}

void CExtracted::ShowText(CString s,RECT re,CEdit *edit)
{
	edit=new CEdit;
	edit->Create(ES_CENTER|WS_VISIBLE|ES_READONLY,re,this,1);
	CFont *m_font=new CFont;
	m_font->CreateFont(14,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Arial");
	edit->SetFont(m_font,TRUE);
	edit->SetWindowText(s);
}



void CExtracted::OnExtracted() 
{
	// TODO: Add your control notification handler code here
	BYTE r,b;
	UpdateData(TRUE);
	m_WaterExtractedData=new RGBQUAD*[ImageHeight];
 for(int n=0;n<ImageHeight;n++)
	 m_WaterExtractedData[n]=new RGBQUAD [ImageWidth];
 for(int i=0;i<ImageHeight;i++)
	 for(int j=0;j<ImageWidth;j++)
	 {
         r=m_WaterEmbedData1[i][j].rgbRed;
		 b=m_WaterEmbedData1[i][j].rgbBlue;
         RLSB_watermarking(i,j,r,b);
	
	 }
 CDC *m_dc=GetDC();
GetDlgItem(IDC_STATIC5)->GetClientRect(&rect[2]);
int startx=rect[2].left+273;
int starty=rect[2].top+10;
float p,q;//缩放比例
if(m_height*m_width!=0)
	{
		WaterHeight=m_height;
		WaterWidth=m_width;
if(rect[2].right<WaterWidth&&rect[2].bottom<WaterHeight)
{
  p=(float)rect[2].right/WaterWidth;
  q=(float)rect[2].bottom/WaterHeight;
}
else
  q=p=1;
SetExtractedImagePixel(m_dc,startx,starty,WaterHeight,WaterWidth,m_WaterExtractedData,p,q);
ReleaseDC(m_dc);
GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);
	}
	else
		MessageBox("请输入水印信息:Heigth X Width!");
}

void CExtracted::RLSB_watermarking(int i,int j,BYTE a,BYTE b)
{
   /* BYTE m=15,gray,c,d;
   c=a;
   d=b;
   a&=m;
   b&=m;
   a<<=4;
   gray=a+b;
*/

BYTE x[8],gray;
int m;
for(m=0;m<4;m++)
{
	x[m]=b&1;
	b>>=1;
}
for(m=4;m<8;m++)
{
	x[m]=a&1;
	a>>=1;
}
gray=x[0]*1+x[1]*2+x[2]*4+x[3]*8+x[4]*16+x[5]*32+x[6]*64+x[7]*128;

m_WaterExtractedData[i][j].rgbGreen=gray;
m_WaterExtractedData[i][j].rgbRed=gray;
m_WaterExtractedData[i][j].rgbBlue=gray;

}


void CExtracted:: SetExtractedImagePixel(CDC *pdc,int x_start,int y_start,int height,int width,RGBQUAD **m_imagedata,float a,float b)
{

for(int i=0;i<height;i++)
  for(int j=0;j<width;j++)
     pdc->SetPixel(x_start+(int)(j*a),y_start+(int)(i*b),RGB(m_imagedata[i][j].rgbRed,m_imagedata[i][j].rgbGreen,m_imagedata[i][j].rgbBlue));

}
void CExtracted::OnSaveExtracted() 
{
	// TODO: Add your control notification handler code here
		CFileDialog dlg(FALSE,"未标题 bmp","未标题 bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp");
	if(dlg.DoModal()==IDOK)
	{
		CDib *m_saveDib;
		m_saveDib=new CDib;
		m_saveDib=m_dib;
	//	int byteBitCount=m_saveDib->GetBiBitCount()/8;
		int byteBitCount=1;
	//	long Hei=m_saveDib->GetHeight();
	//	long Wid=m_saveDib->GetWidth();
    	long	Hei=m_height;
    	long	Wid=m_width;
		int c=0;
		for(int i=Hei-1;i>=0;i--)
		{
			for(int j=0;j<Wid;j++)
			{
				((BYTE *)m_saveDib->m_pDibBits)[c++]=m_WaterExtractedData[i][j].rgbBlue;
                 ((BYTE *)m_saveDib->m_pDibBits)[c++]=m_WaterExtractedData[i][j].rgbGreen;
				 ((BYTE *)m_saveDib->m_pDibBits)[c++]=m_WaterExtractedData[i][j].rgbRed;
				 c+=byteBitCount-3;
			}
			c+=(4-(Wid*byteBitCount)%4)%4;
		}
		CString savename;
		savename=dlg.GetPathName();
		m_saveDib->Save(savename);

	}
	return;
}

void CExtracted::OnClearImage() 
{
	// TODO: Add your control notification handler code here
	ImageHeight=ImageWidth=biBitCount=0;
	str="嵌入水印图象:0位H×W:0X0";
	ShowText(str,r,m_edit);
	hDesDC[0]=NULL;
    ::DeleteObject(hDesDC[0]);
	 GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
	 GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
	 m_height=0;
	 m_width=0;
	UpdateData(FALSE);
	Invalidate();
}

⌨️ 快捷键说明

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