📄 extracted.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 + -