📄 imageproview.cpp
字号:
// ImageProView.cpp : implementation of the CImageProView class
//
#include "stdafx.h"
#include "ImagePro.h"
#include "ImageProDoc.h"
#include "ImageProView.h"
#include "mask.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImageProView
IMPLEMENT_DYNCREATE(CImageProView, CView)
BEGIN_MESSAGE_MAP(CImageProView, CView)
//{{AFX_MSG_MAP(CImageProView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_HISTOGRAM, OnHistogram)
ON_COMMAND(ID_SMOTH, OnSmoth)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageProView construction/destruction
CImageProView::CImageProView()
{
// TODO: add construction code here
m_bHist=false;
}
CImageProView::~CImageProView()
{
}
BOOL CImageProView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageProView drawing
void CImageProView::OnDraw(CDC* pDC)
{
CImageProDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(m_dib.m_bLoaded==true)
{
int nw=m_dib.GetDIBWidth();
int nh=m_dib.GetDIBHeight();
m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);
m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI);
}
if(m_bHist==true)
{
//绘画直方图
CString str;
int nh=m_dib.GetDIBHeight();
int i;
// 画坐标轴
// 绘制坐标轴
pDC->MoveTo(10,nh+20); //(10,nh+20 )是直方图的左上角坐标
// 垂直轴
pDC->LineTo(10,nh+200);//(10,nh+200 )是直方图的左下角坐标
// 水平轴
pDC->LineTo(310,nh+200);//(310,nh+200 )是直方图的右下角坐标
// 写X轴刻度值
str.Format("0");
pDC->TextOut(10, nh+200+10, str);
str.Format("50");
pDC->TextOut(60, nh+200+10, str);
str.Format("100");
pDC->TextOut(110, nh+200+10, str);
str.Format("150");
pDC->TextOut(160, nh+200+10, str);
str.Format("200");
pDC->TextOut(210, nh+200+10, str);
str.Format("255");
pDC->TextOut(265, nh+200+10, str);
// 绘制X轴刻度
for ( i = 0; i < 256; i += 25)
{
if ((i & 1) == 0)
{
// 10的倍数
pDC->MoveTo(i + 10, nh+200-2);
pDC->LineTo(i + 10, nh+200+2);
}
else
{
// 10的倍数
pDC->MoveTo(i + 10, nh+200-2);
pDC->LineTo(i + 10, nh+200+2);
}
}
// 绘制X轴箭头
pDC->MoveTo(305,nh+200-5);
pDC->LineTo(310,nh+200);
pDC->LineTo(305,nh+200+5);
// 绘制y轴箭头
pDC->MoveTo(10,nh+20);
pDC->LineTo(5,nh+20+5);
pDC->MoveTo(10,nh+20);
pDC->LineTo(15,nh+20+5);
int max=0;
for(i=0;i<256;i++)
if(m_hist[i]>max)
max=m_hist[i];
// str.Format("d%",max);
// pDC->TextOut(12, nh+200-170, str);
// 蓝色画笔
// CPen *pPenBlue;
//pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));
//CGdiObject* pOldPen = pDC->SelectObject(pPenBlue);
for(i=0;i<256;i++)
{
pDC->MoveTo(10+i,nh+200);
pDC->LineTo(10+i,nh+200-(m_hist[i]*160/max));
}
// delete pPenGray;
// delete pPenBlue;
//pDC->SelectObject(pOldPen);
}
}
/////////////////////////////////////////////////////////////////////////////
// CImageProView printing
BOOL CImageProView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CImageProView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CImageProView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CImageProView diagnostics
#ifdef _DEBUG
void CImageProView::AssertValid() const
{
CView::AssertValid();
}
void CImageProView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CImageProDoc* CImageProView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageProDoc)));
return (CImageProDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageProView message handlers
void CImageProView::OnFileOpen()
{
// TODO: Add your command handler code here
static char szFilter[]="BMP文件(*.bmp)|*.bmp||";
CFileDialog dlg(TRUE,"bmp",NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
CString filename;
int ret=dlg.DoModal();
if(ret==IDOK)
{
filename=dlg.GetFileName();
m_dib.LoadFromFile(filename);
if(!m_dib.m_bLoaded)
{
AfxMessageBox("图像打不开");
return;
}
for(int i=0;i<256;i++) //初始化直方图数组
m_hist[i]=0;
m_bHist=false;
}
Invalidate(1);
}
void CImageProView::OnHistogram()
{
// TODO: Add your command handler code here
if(m_dib.m_bLoaded!=true)
{
AfxMessageBox("要处理的图像文件没打开");
return;
}
int i,j;
BYTE* pdata=m_dib.m_pdata;
int nh=m_dib.GetDIBHeight();
int nw=m_dib.GetDIBWidth();
for(i=0;i<256;i++) //初始化直方图数组
m_hist[i]=0;
if( m_dib.m_nImType==24)
{
for(j=0;j<nh;j++)
for(i=0;i<nw;i++)
{
BYTE temp=pdata[j*nw+i];
m_hist[temp]++;
}
}
m_bHist=true;
Invalidate(1);
}
void CImageProView::OnSmoth()
{
// TODO: Add your command handler code here
//均值滤波;
if(m_dib.m_bLoaded!=true)
{
AfxMessageBox("要处理的图像文件没打开");
return;
}
int i,j;
BYTE* pdata=m_dib.m_pdata;
int nh=m_dib.GetDIBHeight();
int nw=m_dib.GetDIBWidth();
if( m_dib.m_nImType==24) //目前仅仅对24位bmp图进行
{
Mask dlg;
int ret=dlg.DoModal();
if(ret==IDOK)
{
//从对话框中获取相关的模板运算的信息
int* mask=dlg.mask; //模板指针
int mask_width=dlg.m_width; // 模板大小
float mask_coef=dlg.m_coef; //模板的系数
int wid=(mask_width-1)/2; //计算运算的边界
BYTE* temp=new BYTE[nh*nw]; //开辟临时内存
memcpy(temp,m_dib.m_pdata,nh*nw);
for(j=wid;j<nh-wid;j++) //row
for(i=wid;i<nw-wid;i++) //col
{
int amount=0;
for(int k=-wid;k<=wid;k++)
for(int l=-wid;l<=wid;l++)
amount+=temp[(j+k)*nw+i+l]*mask[(k+wid)*mask_width+l+wid];
amount=int(amount*mask_coef);
if(amount<0)
amount=0;
if(amount>255)
amount=255;
pdata[j*nw+i]=BYTE(amount);
}
m_dib.InvalidateData();
delete temp;
Invalidate(1);
}
}
}
int CImageProView::abs(int a, int b)
{
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -