📄 showpixview.cpp
字号:
// ShowPixView.cpp : implementation of the CShowPixView class
//
#include "stdafx.h"
#include "ShowPix.h"
#include <math.h>
#include "ShowPixDoc.h"
#include "ShowPixView.h"
#include "MoveDialog.h"
#include "StretchDialog.h"
#include "RotateDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CShowPixView
IMPLEMENT_DYNCREATE(CShowPixView, CScrollView)
BEGIN_MESSAGE_MAP(CShowPixView, CScrollView)
//{{AFX_MSG_MAP(CShowPixView)
ON_COMMAND(ID_SHOWPIX, OnShowpix)
ON_COMMAND(ID_SMOOTH, OnSmooth)
ON_COMMAND(ID_SMOOTH1, OnSmooth1)
ON_COMMAND(ID_FILTER, OnFilter)
ON_COMMAND(ID_RUIHUA, OnRuihua)
ON_COMMAND(ID_SOBLE, OnSoble)
ON_COMMAND(ID_GAUS, OnGaus)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_MOVE, OnMove)
ON_COMMAND(ID_XMIRRO, OnXmirro)
ON_COMMAND(ID_YMIRRO, OnYmirro)
ON_COMMAND(ID_TRANSPOSE, OnTranspose)
ON_COMMAND(ID_STRETCH, OnStretch)
ON_COMMAND(ID_ROTATE, OnRotate)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CShowPixView construction/destruction
CShowPixView::CShowPixView()
{
m_info=NULL;
m_pData=NULL;
m_flag=-1;
}
CShowPixView::~CShowPixView()
{
if( m_info )
{
delete [] m_info;
m_info = NULL;
}
if( m_pData )
{
delete [] m_pData;
m_pData = NULL;
}
}
BOOL CShowPixView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CShowPixView drawing
void CShowPixView::OnDraw(CDC* pDC)
{
CShowPixDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//SetStretchBltMode(COLORONCOLOR);
if( (m_info != NULL) && (m_pData != NULL) )
{
switch( m_flag )
{
case 0:
::StretchDIBits(this->GetDC()->GetSafeHdc(),0,0,m_info->bmiHeader.biWidth,m_info->bmiHeader.biHeight,
0,0,m_info->bmiHeader.biWidth,m_info->bmiHeader.biHeight,m_pData,m_info,DIB_RGB_COLORS,SRCCOPY);
break;
case 1:
// Draw coordinate
int Areint[256];
int p=(m_info->bmiHeader.biWidth+3)/4*4;
for( int index = 0; index < 256; index++ )
Areint[index] = 0;
for (int i=0;i<m_info->bmiHeader.biHeight;i++)
{
for(int j=0;j<m_info->bmiHeader.biWidth;j++)
{
Areint[ m_pData[i*p+j] ]++;
}
}
int nY = -900;
int nX = 400;
pDC->MoveTo( nX, nY );
pDC->LineTo( nX + 500, nY );
pDC->LineTo( nX + 485, nY+5 );
pDC->MoveTo( nX + 500, nY);
pDC->LineTo( nX + 485, nY-5 );
pDC->MoveTo( nX, nY );
pDC->LineTo( nX ,0);
pDC->LineTo( nX-5, -15);
pDC->MoveTo(nX ,0 );
pDC->LineTo( nX +5, -15);
for( index = 0; index < 256; index++ )
{
pDC->MoveTo( nX +index, nY);
pDC->LineTo( nX+index, nY + Areint[index]);
}
}
}
}
void CShowPixView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal(10000,10000);
CSize sizeLine=CSize(sizeTotal.cx/100,sizeTotal.cy/100);
// TODO: calculate the total size of this view
SetScrollSizes(MM_LOENGLISH,sizeTotal,sizeTotal,sizeLine );
}
/////////////////////////////////////////////////////////////////////////////
// CShowPixView printing
BOOL CShowPixView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CShowPixView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CShowPixView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CShowPixView diagnostics
#ifdef _DEBUG
void CShowPixView::AssertValid() const
{
CScrollView::AssertValid();
}
void CShowPixView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CShowPixDoc* CShowPixView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShowPixDoc)));
return (CShowPixDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CShowPixView message handlers
void CShowPixView::OnShowpix()
{
// TODO: Add your command handler code here
//设置标志位
m_flag=1;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
AfxMessageBox("此处显示灰度统计直方图,要查看灰度值,请打开项目文件夹中的value.txt");
//打开文件
CFile fileSave;
fileSave.Open( "Value.txt", CFile::modeWrite | CFile::modeCreate );
//读取各个象素点的灰度值
for( int i = 0; i < m_info->bmiHeader.biHeight; i++ )//逐行扫描
{
CString strValue;
CString strNum;
strNum.Format( "R%03d:", i+1 );
strValue = strNum;
for( int j = 0; j < m_info->bmiHeader.biWidth; j++ )//按从左到右扫描
{
CString strRow;
strRow.Format( "%03d ", m_pData[i*p+j] );
strValue += strRow;
}
strValue += "\r\n";
//每读取完一行数据就写入文件
fileSave.Write( strValue, strValue.GetLength());
}
fileSave.Close();
Invalidate();
}
void CShowPixView::OnSmooth()
{
// TODO: Add your command handler code here
//设置标志位
m_flag=0;
int i,j;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
//建立临时数组
int *smooth=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
//平滑 高斯模版{1,2,1,2,4,2,1,2,1}
for( i = 0; i < m_info->bmiHeader.biHeight; i++ )//逐行扫描
{
for( j = 0; j < m_info->bmiHeader.biWidth; j++ )//按从左到右扫描
{
//边缘点的灰度值不变
if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
{}
else
{
smooth[i*p+j]=(4*m_pData[i*p+j]+
2*m_pData[i*p+j-1]+
2*m_pData[i*p+j+1]+
2*m_pData[(i-1)*p+j]+
2*m_pData[(i+1)*p+j]+
m_pData[(i-1)*p+j-1]+
m_pData[(i-1)*p+j+1]+
m_pData[(i+1)*p+j-1]+
m_pData[(i+1)*p+j+1])/16;
}
}// for
}//for
//赋值
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
m_pData[i*p+j]=smooth[i*p+j];
}
free(smooth);
Invalidate();
}
void CShowPixView::OnSmooth1()
{
// TODO: Add your command handler code here
//设置标志位
m_flag=0;
int i,j;int p=(m_info->bmiHeader.biWidth+3)/4*4;
//建立临时数组
int *smooth1=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
//平滑 设置Box模版{1,1,1,1,1,1,1,1,1}
for( i = 0; i < m_info->bmiHeader.biHeight; i++ )//逐行扫描
{
for( j = 0; j < m_info->bmiHeader.biWidth; j++ )//按从左到右扫描
{
//边缘点的灰度值不变
if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
{}
else
{
smooth1[i*p+j]=(m_pData[i*p+j]+
m_pData[i*p+j-1]+
m_pData[i*p+j+1]+
m_pData[(i-1)*p+j]+
m_pData[(i+1)*p+j]+
m_pData[(i-1)*p+j-1]+
m_pData[(i-1)*p+j+1]+
m_pData[(i+1)*p+j-1]+
m_pData[(i+1)*p+j+1])/9;
}
}// for
}//for
//赋值
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
m_pData[i*p+j]=smooth1[i*p+j];
}
free(smooth1);
Invalidate();
}
void CShowPixView::OnFilter()
{
// TODO: Add your command handler code here
//设置标志位
m_flag=0;
int i,j;
int temp=0;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
int *middle=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
{
middle[i*p+j]=m_pData[i*p+j];
}
}
//过滤
//水平方向取中值
for( i = 0; i < m_info->bmiHeader.biHeight; i++ )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j++ )
{
if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
{}
else
{
//边缘点的灰度值不变
if(middle[i*p+j]>middle[i*p+j+1]&&
middle[i*p+j]>middle[i*p+j-1])
{
if(middle[i*p+j+1]>middle[i*p+j-1])
middle[i*p+j]=middle[i*p+j+1];
else
middle[i*p+j]=middle[i*p+j-1];
}
}
}
}
//垂直方向取中值
for( j = 0; j < m_info->bmiHeader.biWidth; j++ )
{
for( i = 0; i < m_info->bmiHeader.biHeight; i++ )
{
//边缘点的灰度值不变
if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
{}
else
{
if(middle[i*p+j]>middle[(i-1)*p+j]&&
middle[i*p+j]>middle[(i+1)*p+j])
{
if(middle[(i-1)*p+j]>middle[i*p+j])
middle[i*p+j]=middle[(i-1)*p+j];
else
middle[i*p+j]=middle[(i+1)*p+j];
}
}
}
}
//赋值
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
m_pData[i*p+j]=middle[i*p+j];
}
free(middle);
Invalidate();
}
void CShowPixView::OnRuihua()
{
// TODO: Add your command handler code here
//设置标志位
m_flag=0;
int i,j;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
//建立临时数组
int *pix2=(int *)malloc(p*m_info->bmiHeader.biHeight*sizeof(int));
//锐化 模板为{-1,-1,-1,-1,9,-1,-1,-1,-1}
for( i = 0; i < m_info->bmiHeader.biHeight; i++ )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j++ )
{
//边缘点的灰度值不变
if (j==0||j==m_info->bmiHeader.biWidth-1||i==0||i==m_info->bmiHeader.biHeight-1)
{}
else
{
pix2[i*p+j] = 9*m_pData[i*p+j]-
(m_pData[(i+1)*p+j]+
m_pData[(i+1)*p+j+1]+
m_pData[(i+1)*p+j-1]+
m_pData[i*p+j+1]+
m_pData[i*p+j-1]+
m_pData[(i-1)*p+j+1]+
m_pData[(i-1)*p+j-1]+
m_pData[(i-1)*p+j]);
//灰度超过255按255来计,小于0按0来计
if( pix2[i*p+j]>255)
pix2[i*p+j]=255;
else
{
if( pix2[i*p+j]<0)
pix2[i*p+j]=0;
}
}//else
}// for
}//for
//赋值
for( i = 0; i < m_info->bmiHeader.biHeight; i=i+1 )
{
for( j = 0; j < m_info->bmiHeader.biWidth; j=j+1 )
m_pData[i*p+j]=pix2[i*p+j];
}
free(pix2);
Invalidate();
}
void CShowPixView::OnSoble()
{
// TODO: Add your command handler code here
//设置标志位
m_flag=0;
int i,j;
int p=(m_info->bmiHeader.biWidth+3)/4*4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -