📄 demoview.cpp
字号:
pDocNew->UpdateAllViews(pView);
Invalidate();
}
}
void CDemoView::OnRobot()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[w*h*b];
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
}
}
robot(buf, w, h, b);
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
void CDemoView::Onprewitt()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[w*h*b];
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
}
}
prewitt(buf, w, h, b);
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
void CDemoView::OnLaplacian()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[w*h*b];
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
}
}
laplacian(buf, w, h, b);
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
void CDemoView::OnMeanFilter()
{
MaskDlg dlg;
if(dlg.DoModal()==IDOK){
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[w*h*b];
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
}
}
int maskSize, mask[49];
if(dlg.m_MaskStyle==3){
DefineMaskDlg defDlg;
if(defDlg.DoModal()==IDOK){
int m[25]={defDlg.m_maskEdit1, defDlg.m_maskEdit2, defDlg.m_maskEdit3, defDlg.m_maskEdit4, defDlg.m_maskEdit5,
defDlg.m_maskEdit6, defDlg.m_maskEdit7, defDlg.m_maskEdit8, defDlg.m_maskEdit9, defDlg.m_maskEdit10,
defDlg.m_maskEdit11, defDlg.m_maskEdit12, defDlg.m_maskEdit13, defDlg.m_maskEdit14, defDlg.m_maskEdit15,
defDlg.m_maskEdit16, defDlg.m_maskEdit17, defDlg.m_maskEdit18, defDlg.m_maskEdit19, defDlg.m_maskEdit20,
defDlg.m_maskEdit21, defDlg.m_maskEdit22, defDlg.m_maskEdit23, defDlg.m_maskEdit24, defDlg.m_maskEdit25};
for(i=0;i<25;i++)
mask[i]=m[i];
maskSize=5;
}
else{
for(i=0;i<9;i++)
mask[i]=1;
maskSize=3;
}
}
else{
if(dlg.m_MaskStyle==0)
maskSize=3;
else if(dlg.m_MaskStyle==1)
maskSize=5;
else if(dlg.m_MaskStyle==2)
maskSize=7;
for(i=0;i<maskSize;i++)
for(j=0;j<maskSize;j++)
mask[i*maskSize+j]=1;
}
meanFilter(buf, w, h, b, mask,maskSize);
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
}
void CDemoView::OnMidleFilter()
{
MaskDlg dlg;
if(dlg.DoModal()==IDOK){
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[w*h*b];
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
}
}
int maskSize, mask[49];
if(dlg.m_MaskStyle==3){
DefineMaskDlg defDlg;
if(defDlg.DoModal()==IDOK){
int m[25]={defDlg.m_maskEdit1, defDlg.m_maskEdit2, defDlg.m_maskEdit3, defDlg.m_maskEdit4, defDlg.m_maskEdit5,
defDlg.m_maskEdit6, defDlg.m_maskEdit7, defDlg.m_maskEdit8, defDlg.m_maskEdit9, defDlg.m_maskEdit10,
defDlg.m_maskEdit11, defDlg.m_maskEdit12, defDlg.m_maskEdit13, defDlg.m_maskEdit14, defDlg.m_maskEdit15,
defDlg.m_maskEdit16, defDlg.m_maskEdit17, defDlg.m_maskEdit18, defDlg.m_maskEdit19, defDlg.m_maskEdit20,
defDlg.m_maskEdit21, defDlg.m_maskEdit22, defDlg.m_maskEdit23, defDlg.m_maskEdit24, defDlg.m_maskEdit25};
for(i=0;i<25;i++)
mask[i]=m[i];
maskSize=5;
}
else{
for(i=0;i<9;i++)
mask[i]=1;
maskSize=3;
}
}
else{
if(dlg.m_MaskStyle==0)
maskSize=3;
else if(dlg.m_MaskStyle==1)
maskSize=5;
else if(dlg.m_MaskStyle==2)
maskSize=7;
for(i=0;i<maskSize;i++)
for(j=0;j<maskSize;j++)
mask[i*maskSize+j]=1;
}
midFilter(buf, w, h, b, mask,maskSize);
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
}
void CDemoView::OnThreshSegment()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
if(b!=1){
::MessageBox(0,"只处理灰度图象!",MB_OK,0);
::GlobalUnlock(dib);
return;
}
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[w*h*b];
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
}
}
threshDlg dlg;
if(dlg.DoModal()==IDOK){
int thresh=dlg.m_Thresh;
ErZhiSegment(buf, w, h, thresh);
}
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
void CDemoView::OnDajinThresh()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
if(b!=1){
::MessageBox(0,"只处理灰度图象!",MB_OK,0);
::GlobalUnlock(dib);
return;
}
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[w*h*b];
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
}
}
autoThreshSegment(buf, w, h);
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
void CDemoView::OnImgReverse()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
for(int i=0;i<h*lineByte;i++){
*(lpDIBBits+i)=255-*(lpDIBBits+i);
}
::GlobalUnlock(dib);
Invalidate();
}
void CDemoView::OnRGBToGray()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
if(b!=3){
::MessageBox(0,"只处理彩色图象!",MB_OK,0);
::GlobalUnlock(dib);
return;
}
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i,j, newlineByte=(w+3)/4*4;
int palSize=1024;
HANDLE dibNew=::GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER)+ palSize+h*newlineByte);
LPSTR lpDIBNew = (LPSTR) ::GlobalLock(dibNew);
::memcpy((unsigned char*)lpDIBNew, (unsigned char*)lpDIB, sizeof(BITMAPINFOHEADER)+ palSize);
BITMAPINFOHEADER *info=(BITMAPINFOHEADER*)lpDIBNew;
info->biHeight=h;
info->biWidth=w;
info->biBitCount=8;
LPSTR p=lpDIBNew+sizeof(BITMAPINFOHEADER);
for(i=0;i<256;i++){
for(j=0;j<3;j++)
*(p+i*4+j)=i;
*(p+i*4+3)=0;
}
unsigned char *lpDIBBitsNew=(unsigned char *)::FindDIBBits(lpDIBNew);
for(i=0;i<h;i++){
for(j=0;j<newlineByte;j++){
int Y=0.299*(double)*(lpDIBBits+i*lineByte+j*3+2)+0.587*(double)*(lpDIBBits+i*lineByte+j*3+1)
+0.114*(double)*(lpDIBBits+i*lineByte+j*3+0)+0.1;
*(lpDIBBitsNew+i*newlineByte+j)=Y;/*0.30* *(lpDIBBits+i*lineByte+j*3+0)
+0.59* *(lpDIBBits+i*lineByte+j*3+1)
+0.11* *(lpDIBBits+i*lineByte+j*3+2);*/
}
}
::GlobalUnlock(dib);
::GlobalUnlock(dibNew);
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
CDemoDoc* pDocNew=pView->GetDocument();
pDocNew->ReplaceHDIB((HDIB)dibNew);
pDocNew->InitDIBData();
pDocNew->UpdateAllViews(pView);
Invalidate();
}
void CDemoView::OnlinearTrans()
{
linearStretch dlg;
if(dlg.DoModal()==IDOK){
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
int i, j;
unsigned char *buf=new unsigned char[lineByte*h];
int posData[4];
posData[0]=dlg.m_point1X;
posData[1]=dlg.m_point1Y;
posData[2]=dlg.m_point2X;
posData[3]=dlg.m_point2Y;
if(b==1)
Graytransition(lpDIBBits,buf,w,h,posData);
else
RGBtransition(lpDIBBits,buf,w,h,posData);
for(i=0;i<h;i++){
for(j=0;j<w*b;j++){
*(lpDIBBits+i*lineByte+j)=*(buf+i*lineByte+j);
}
}
::GlobalUnlock(dib);
delete []buf;
Invalidate();
}
}
void CDemoView::OnhistAver()
{
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = ::DIBWidth(lpDIB);
int h = phead->biHeight;
int b = phead->biBitCount/8;
int lineByte=(w * b+3)/4*4;
unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
unsigned char*lpIn=lpDIBBits;
if(b==1)
{
int lineByte1=(w * b+3)/4*4;
unsigned char *lpOut=new unsigned char [h*lineByte1];
PointEqual((LPBYTE)lpIn,(LPBYTE)lpOut,w,h,256);
::memcpy(lpIn,lpOut,h*lineByte1);
::GlobalUnlock(dib);
pDoc->SetModifiedFlag(TRUE);
delete []lpOut;
}
else if(b==3)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -