📄 bmptestview.cpp
字号:
// BmpTestView.cpp : implementation of the CBmpTestView class
//
#include "stdafx.h"
#include "BmpTest.h"
#include "stack.h"
#include "BmpTestDoc.h"
#include "BmpTestView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MIN(a,b) (a<b? a:b)
#define MAX(a,b) (a>b? a:b)
#define NO_HUE -1;
int m_Grade[256],m_Gradmax=0,m_Grade_Blue[256],m_Grade_Green[256],m_Grade_Red[256],b[1024][1024];
extern void str(int quotient,char addr[15]);
extern BOOL Contour(CBmpTestDoc* pDoc,double *pAnew_mon,BOOL bmoment,double n,double *protate);
extern BOOL GCC(CBmpTestDoc* pDoc,double *n,POINT *gcc);
extern void Sh_Rotate(CBmpTestDoc* pDoc,double ro_angle,double size,POINT *pav_cent);
DISTANCE distbmp[50];
/////////////////////////////////////////////////////////////////////////////
// CBmpTestView
IMPLEMENT_DYNCREATE(CBmpTestView, CScrollView)
BEGIN_MESSAGE_MAP(CBmpTestView, CScrollView)
//{{AFX_MSG_MAP(CBmpTestView)
ON_COMMAND(ID_BT_BLACKNESS, OnBtBlackness)
ON_COMMAND(ID_BT_DSTINVERT, OnBtDstinvert)
ON_COMMAND(ID_BT_MERGECOPY, OnBtMergecopy)
ON_COMMAND(ID_BT_MERGEPAINT, OnBtMergepaint)
ON_COMMAND(ID_BT_NOTSRCCOPY, OnBtNotsrccopy)
ON_COMMAND(ID_BT_NOTSRCERASE, OnBtNotsrcerase)
ON_COMMAND(ID_BT_PATCOPY, OnBtPatcopy)
ON_COMMAND(ID_BT_PATINVERT, OnBtPatinvert)
ON_COMMAND(ID_BT_PATPAINT, OnBtPatpaint)
ON_COMMAND(ID_BT_SRCAND, OnBtSrcand)
ON_COMMAND(ID_BT_SRCCOPY, OnBtSrccopy)
ON_COMMAND(ID_BT_SRCERASE, OnBtSrcerase)
ON_COMMAND(ID_BT_SRCINVERT, OnBtSrcinvert)
ON_COMMAND(ID_BT_SRCPAINT, OnBtSrcpaint)
ON_COMMAND(ID_BT_WHITENESS, OnBtWhiteness)
ON_COMMAND(ID_ZFT_SHOW, OnZftShow)
ON_COMMAND(ID_ZFT_BALANCE, OnZftBalance)
ON_COMMAND(ID_IMAGE_SHOW, OnImageShow)
ON_COMMAND(ID_DTSM_IN, OnDtsmIn)
ON_COMMAND(ID_DTSM_SHOW, OnDtsmShow)
ON_COMMAND(ID_DTSM_OUT, OnDtsmOut)
ON_COMMAND(ID_REC_FILT, OnRecFilt)
ON_COMMAND(ID_MID_FILT, OnMidFilt)
ON_COMMAND(ID_EDGE_ROBERT, OnEdgeRobert)
ON_COMMAND(ID_EDGE_LAPLACE, OnEdgeLaplace)
ON_COMMAND(ID_GAUSE_FILT, OnGauseFilt)
ON_COMMAND(ID_EDGE_MARR, OnEdgeMarr)
ON_COMMAND(ID_STRU_ADD, OnStruAdd)
ON_COMMAND(ID_STRU_SUB, OnStruSub)
ON_COMMAND(ID_STRU_OPEN, OnStruOpen)
ON_COMMAND(ID_STRU_CLOSE, OnStruClose)
ON_COMMAND(ID_EDIT_BACKUP, OnEditBackup)
ON_COMMAND(ID_EDIT_BLUE, OnEditBlue)
ON_COMMAND(ID_EDIT_GREEN, OnEditGreen)
ON_COMMAND(ID_EDIT_RED, OnEditRed)
ON_COMMAND(ID_EDGE_COLORPREWITT, OnEdgeColorprewitt)
ON_COMMAND(ID_EDGE_COLORROBERT, OnEdgeColorrobert)
ON_COMMAND(ID_MID_FILT_LINE, OnMidFiltLine)
ON_COMMAND(ID_DENSITY_SCAN, OnDensityScan)
ON_COMMAND(ID_ROW_DILATION, OnRowDilation)
ON_COMMAND(ID_EDGE_COLORPREWITT1, OnEdgeColorprewitt1)
ON_COMMAND(ID_EDGE_COLORROBERT1, OnEdgeColorrobert1)
ON_COMMAND(ID_ROW_EROSION, OnRowErosion)
ON_COMMAND(ID_CLOSE, OnClose)
ON_COMMAND(ID_GET, OnGet)
ON_COMMAND(ID_RELA_SCAN, OnRelaScan)
ON_COMMAND(ID_DENSITY_SCAN_MID, OnDensityScanMid)
ON_COMMAND(ID_AREA_MARK, OnAreaMark)
ON_COMMAND(ID_LOCATING, OnLocating)
ON_COMMAND(ID_VEHICLE_BITMAP, OnVehicleBitmap)
ON_COMMAND(ID_BLUE_CUT, OnBlueCut)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBmpTestView construction/destruction
CBmpTestView::CBmpTestView()
{
// TODO: add construction code here
m_Rop=SRCCOPY;
}
CBmpTestView::~CBmpTestView()
{
}
BOOL CBmpTestView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CBmpTestView drawing
void CBmpTestView::OnDraw(CDC* pDC)
{
CPen pen,*open;
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//设置滚动视图大小,使之与Dib大小一致:
CSize sizeTotal;
sizeTotal.cx = pDoc->m_Dib.Width;
sizeTotal.cy = pDoc->m_Dib.Height+100;
SetScrollSizes(MM_TEXT, sizeTotal);
//绘制Dib:
if (pDoc->m_BM)
{
//在滚动视图中绘制背景:
CBitmap pat;
CBrush br,* obr;
CRect rc;
rc.top=0;
rc.left=0;
rc.right=sizeTotal.cx;
rc.bottom=sizeTotal.cy;
GetClientRect(&rc); //获得矩形区域大小
pat.LoadBitmap(IDB_BITMAP2); //IDB_BITMAP2->pat
br.CreatePatternBrush(&pat); //创建模式刷, pat->br
obr=pDC->SelectObject(&br);
pDC->FillRect(&rc,&br); //用画刷填充整个矩形区域
pDC->SelectObject(obr);
br.DeleteObject();
CRect dibrect;
dibrect.top=0;
dibrect.left=0;
dibrect.right=sizeTotal.cx;
dibrect.bottom=sizeTotal.cy;
pDoc->m_Dib.Draw(pDC->GetSafeHdc(),dibrect,dibrect);
}
/*绘制DDB:
CBitmap ddb;
ddb.LoadBitmap( IDB_BITMAP1 );
// Calculate bitmap size using a BITMAP structure.
BITMAP bm;
ddb.GetObject( sizeof(BITMAP), &bm );
// Create a memory DC, select the bitmap into the
// memory DC, and BitBlt it into the view.
CDC dcMem;
dcMem.CreateCompatibleDC( pDC );
CBitmap* pbmpOld = dcMem.SelectObject( &ddb );
pDC->BitBlt( dibrect.Width()/2,dibrect.Height()/2,
dibrect.Width()/2+bm.bmWidth,dibrect.Height()/2+bm.bmHeight,
&dcMem,
0,0,
m_Rop
);
// Reselect the original bitmap into the memory DC.
dcMem.SelectObject( pbmpOld ); */
else
{
CBrush br,* obr;
CRect rc;
CString s;
rc.top=0;
rc.left=0;
rc.right=sizeTotal.cx;
rc.bottom=sizeTotal.cy;
GetClientRect(&rc);
br.CreateSolidBrush(RGB(255,255,255));
obr=pDC->SelectObject(&br);
pDC->FillRect(&rc,&br);
pDC->SelectObject(obr);
br.DeleteObject();
if(pDoc->m_Dib.BPP>=16)
{
pen.CreatePen(0,2,RGB(0,0,255));
open=pDC->SelectObject(&pen);
pDC->MoveTo(10,150);
pDC->LineTo(520,150);
int i,j=10,k=0;
for ( i=0;i<256;i=i+20)
{
s.Format("%d",i);
pDC->TextOut(10+i*2, 150, s);
}
for ( i=0;i<256;i++)
{
pDC->MoveTo(j,150);
if (m_Gradmax!=0) k=150-(int)m_Grade_Blue[i]*150/m_Gradmax;
pDC->LineTo(j,k);
j=j+2;
}
pen.DeleteObject();
pen.CreatePen(0,2,RGB(0,255,0));
open=pDC->SelectObject(&pen);
pDC->MoveTo(10,310);
pDC->LineTo(520,310);
j=10;
for ( i=0;i<256;i=i+20)
{
s.Format("%d",i);
pDC->TextOut(10+i*2, 310, s);
}
for ( i=0;i<256;i++)
{
pDC->MoveTo(j,310);
if (m_Gradmax!=0) k=310-(int)m_Grade_Green[i]*150/m_Gradmax;
pDC->LineTo(j,k);
j=j+2;
}
pen.DeleteObject();
pen.CreatePen(0,2,RGB(255,0,0));
open=pDC->SelectObject(&pen);
pDC->MoveTo(10,470);
pDC->LineTo(520,470);
for ( i=0;i<256;i=i+20)
{
s.Format("%d",i);
pDC->TextOut(10+i*2, 470, s);
}
j=10;
for ( i=0;i<256;i++)
{
pDC->MoveTo(j,470);
if (m_Gradmax!=0) k=470-(int)m_Grade_Red[i]*150/m_Gradmax;
pDC->LineTo(j,k);
j=j+2;
}
j=10;
pDC->SelectObject(open);
pen.DeleteObject();
pDC->MoveTo(j,10);
}
else
{
pen.CreatePen(0,2,RGB(0,0,0));
open=pDC->SelectObject(&pen);
pDC->MoveTo(10,260);
pDC->LineTo(520,260);
pDC->TextOut(200, 300, " 的直方图");
int i,j=10,k=0;
for ( i=0;i<256;i=i+20)
{
s.Format("%d",i);
pDC->TextOut(10+i*2, 260, s);
}
for ( i=0;i<256;i++)
{
pDC->MoveTo(j,260);
if (m_Gradmax!=0) k=260-(int)m_Grade[i]*250/m_Gradmax;
pDC->LineTo(j,k);
j=j+2;
}
pDC->SelectObject(open);
pen.DeleteObject();
pDC->MoveTo(j,10);
}
}
}
void CBmpTestView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CBmpTestView printing
BOOL CBmpTestView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CBmpTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CBmpTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CBmpTestView diagnostics
#ifdef _DEBUG
void CBmpTestView::AssertValid() const
{
CScrollView::AssertValid();
}
void CBmpTestView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CBmpTestDoc* CBmpTestView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBmpTestDoc)));
return (CBmpTestDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBmpTestView message handlers
void CBmpTestView::OnBtBlackness()
{
// TODO: Add your command handler code here
m_Rop=BLACKNESS;
Invalidate();
}
void CBmpTestView::OnBtDstinvert()
{
// TODO: Add your command handler code here
m_Rop=DSTINVERT;
Invalidate();
}
void CBmpTestView::OnBtMergecopy()
{
// TODO: Add your command handler code here
m_Rop=MERGECOPY;
Invalidate();
}
void CBmpTestView::OnBtMergepaint()
{
// TODO: Add your command handler code here
m_Rop=MERGEPAINT;
Invalidate();
}
void CBmpTestView::OnBtNotsrccopy()
{
// TODO: Add your command handler code here
m_Rop=NOTSRCCOPY;
Invalidate();
}
void CBmpTestView::OnBtNotsrcerase()
{
// TODO: Add your command handler code here
m_Rop=NOTSRCERASE;
Invalidate();
}
void CBmpTestView::OnBtPatcopy()
{
// TODO: Add your command handler code here
m_Rop=PATCOPY;
Invalidate();
}
void CBmpTestView::OnBtPatinvert()
{
// TODO: Add your command handler code here
m_Rop=PATINVERT;
Invalidate();
}
void CBmpTestView::OnBtPatpaint()
{
// TODO: Add your command handler code here
m_Rop=PATPAINT;
Invalidate();
}
void CBmpTestView::OnBtSrcand()
{
// TODO: Add your command handler code here
m_Rop=SRCAND;
Invalidate();
}
void CBmpTestView::OnBtSrccopy()
{
// TODO: Add your command handler code here
m_Rop=SRCCOPY;
Invalidate();
}
void CBmpTestView::OnBtSrcerase()
{
// TODO: Add your command handler code here
m_Rop=SRCERASE;
Invalidate();
}
void CBmpTestView::OnBtSrcinvert()
{
// TODO: Add your command handler code here
m_Rop=SRCINVERT;
Invalidate();
}
void CBmpTestView::OnBtSrcpaint()
{
// TODO: Add your command handler code here
m_Rop=SRCPAINT;
Invalidate();
}
void CBmpTestView::OnBtWhiteness()
{
// TODO: Add your command handler code here
m_Rop=WHITENESS;
Invalidate();
}
void CBmpTestView::OnZftShow(CDC *pDC)
{
// TODO: Add your command handler code here
/* CRect rc;
GetClientRect(&rc); */
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(!pDoc->m_Dib.m_BmpLoaded)
{
AfxMessageBox("还没有打开图像文件");
return;
}
int i;
long j;
if (pDoc->m_Dib.BPP>=16)
{
m_Gradmax=0;
for ( i=0;i<256;i++)
{
m_Grade_Blue[i]=0;
m_Grade_Green[i]=0;
m_Grade_Red[i]=0;
}
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j=j+3)
{
m_Grade_Blue[int(*(pDoc->m_Dib.m_Buffer+j))]++;
m_Grade_Green[int(*(pDoc->m_Dib.m_Buffer+j+1))]++;
m_Grade_Red[int(*(pDoc->m_Dib.m_Buffer+j+2))]++;
}
for ( i=0;i<256;i++)
{
if (m_Grade_Blue[i]>m_Gradmax)
m_Gradmax=m_Grade_Blue[i];
if (m_Grade_Green[i]>m_Gradmax)
m_Gradmax=m_Grade_Green[i];
if (m_Grade_Red[i]>m_Gradmax)
m_Gradmax=m_Grade_Red[i];
}
}
else if (pDoc->m_Dib.BPP==8)
{
m_Gradmax=0;
for ( i=0;i<256;i++)
{
m_Grade[i]=0;
}
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
}
m_Gradmax=0;
for ( i=0;i<256;i++)
{
if (m_Grade[i]>m_Gradmax)
m_Gradmax=m_Grade[i];
}
}
else
{
long int black=0, white=0;
int a;
for ( i=0;i<256;i++)
{
m_Grade[i]=0;
}
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
a=128;
for ( i=0;i<8;i++)
{
if( ((int)*(pDoc->m_Dib.m_Buffer+j) & a)==0)
black++;
else
white++;
a=a>>1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -