www.pudn.com > bmpstudy.rar > exam7View.cpp
// exam7View.cpp : implementation of the CExam7View class
//
#include "stdafx.h"
#include "exam7.h"
#include "exam7Doc.h"
#include "exam7View.h"
#include "ZFT.h"
#include "move.h"
#include "mirror.h"
#include "DlgGray.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExam7View
IMPLEMENT_DYNCREATE(CExam7View, CView)
BEGIN_MESSAGE_MAP(CExam7View, CView)
//{{AFX_MSG_MAP(CExam7View)
ON_COMMAND(ID_LOAD, OnLoad)
ON_COMMAND(ID_TRAN, OnTran)
ON_COMMAND(ID_ZFT, OnZft)
ON_COMMAND(ID_ERZHI, OnErzhi)
ON_COMMAND(ID_GRAY, OnGray)
ON_UPDATE_COMMAND_UI(ID_ZFT, OnUpdateZft)
ON_UPDATE_COMMAND_UI(ID_GRAY, OnUpdateGray)
ON_UPDATE_COMMAND_UI(ID_ERZHI, OnUpdateErzhi)
ON_COMMAND(ID_MOVE, OnMove)
ON_COMMAND(ID_MIRROR, OnMirror)
ON_COMMAND(ID_ROTATE, OnRotate)
ON_COMMAND(ID_BIGGER, OnBigger)
ON_COMMAND(ID_SMALLER, OnSmaller)
ON_COMMAND(ID_GRAYLINETRANS, OnGraylinetrans)
ON_COMMAND(ID_ZFTPOISE, OnZftpoise)
ON_COMMAND(ID_AVERAGEFILTER, OnAveragefilter)
ON_COMMAND(ID_MIDFILTER, OnMidfilter)
ON_UPDATE_COMMAND_UI(ID_TRAN, OnUpdateTran)
ON_UPDATE_COMMAND_UI(ID_MOVE, OnUpdateMove)
ON_UPDATE_COMMAND_UI(ID_MIRROR, OnUpdateMirror)
ON_UPDATE_COMMAND_UI(ID_ROTATE, OnUpdateRotate)
ON_UPDATE_COMMAND_UI(ID_BIGGER, OnUpdateBigger)
ON_UPDATE_COMMAND_UI(ID_SMALLER, OnUpdateSmaller)
ON_UPDATE_COMMAND_UI(ID_GRAYLINETRANS, OnUpdateGraylinetrans)
ON_UPDATE_COMMAND_UI(ID_ZFTPOISE, OnUpdateZftpoise)
ON_UPDATE_COMMAND_UI(ID_AVERAGEFILTER, OnUpdateAveragefilter)
ON_UPDATE_COMMAND_UI(ID_MIDFILTER, OnUpdateMidfilter)
ON_COMMAND(ID_CONTRARYCOLOR, OnContrarycolor)
ON_UPDATE_COMMAND_UI(ID_CONTRARYCOLOR, OnUpdateContrarycolor)
ON_COMMAND(ID_HIGHFLITER, OnHighfliter)
ON_COMMAND(ID_RELIEVO, OnRelievo)
ON_COMMAND(ID_CANVAS, OnCanvas)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CExam7View construction/destruction
CExam7View::CExam7View()
{
// TODO: add construction code here
m_palette = NULL;
m_bGray = false ;
m_x = 0;
m_y = 0;
}
CExam7View::~CExam7View()
{
delete m_palette;
}
BOOL CExam7View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CExam7View drawing
void CExam7View::OnDraw(CDC* pDC)
{
CExam7Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//设置背景
CBrush brush(RGB (180,180,180) );
CBrush* pOldBrush = pDC->SelectObject (&brush);
CRect rcClip ;
pDC->GetClipBox (&rcClip);
pDC->PatBlt (rcClip.left , rcClip.top ,rcClip.Width() , rcClip.Height() ,PATCOPY );
pDC->SelectObject (pOldBrush );
//
CRect rect;
GetClientRect(&rect);
if(m_dib.GetRGB()&&m_dib.IsValid())
{
CPalette* pOldPalette = pDC->SelectPalette(m_palette,true);
pDC->RealizePalette();
//显示图像
::StretchDIBits(pDC->GetSafeHdc(),
rect.Width()/2-ScaledWidth/2+m_x, //目标设备逻辑横坐标(居中显示)
rect.Height()/2-ScaledHeight/2+m_y, //目标设备逻辑纵坐标(居中显示)
ScaledWidth,//显示位图的像素宽
ScaledHeight,//显示位图的像素高度
0,
0,
m_dib.GetWidth(),
m_dib.GetHeight(),
m_dib.GetData(),
m_dib.GetInfo(),
DIB_RGB_COLORS,SRCCOPY);
pDC->SelectPalette(pOldPalette,true);
::DeleteObject(m_palette);
}
}
/////////////////////////////////////////////////////////////////////////////
// CExam7View diagnostics
#ifdef _DEBUG
void CExam7View::AssertValid() const
{
CView::AssertValid();
}
void CExam7View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CExam7Doc* CExam7View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExam7Doc)));
return (CExam7Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CExam7View message handlers
//创建位图调色板
CPalette* CExam7View::CreateBitmapPalette(CDib *pBitmap)
{
if(m_dib.GetNumberOfColors()!=256)
MessageBox("对不起! 不是256色图! 目前此程序还不支持这种位图! ","警告!",MB_ICONWARNING);
struct
{
WORD Version;
WORD NumberOfEntries;
PALETTEENTRY aEntries[256];
}palette={0x300,256};
/* LPLOGPALETTE pLogPal =
(LPLOGPALETTE) new char[2 * sizeof(WORD) +
m_nColorEntries * sizeof(PALETTEENTRY)];
if(m_palette != NULL) //::DeleteObject(m_palette);
m_palette = NULL;
LPLOGPALETTE pLogPal =
(LPLOGPALETTE) new char[2*sizeof(WORD)+256*sizeof(PALETTEENTRY)];
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = 256;*/
LPRGBQUAD pRGBTable = pBitmap->GetRGB();
UINT numberOfColors = pBitmap->GetNumberOfColors();
for(UINT x=0;xCreatePalette((LPLOGPALETTE)&palette);
//delete pLogPal;
return m_palette;
}
void CExam7View::OnLoad()
{
// TODO: Add your command handler code here
CFileDialog dlgFile(TRUE, NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Picture Files (*.bmp;)|*.bmp|", this);
CString str;
//打开文件对话框
if(dlgFile.DoModal()==IDOK)
{
//dlgFile.GetFileName();
str = dlgFile.GetPathName();
}
else return;
//载入文件
m_dib.LoadFile(str);
this->m_bGray = false;
if(m_palette!=NULL) delete m_palette;
m_palette = new CPalette;
m_scale = 1; //控制缩放比例
// BYTE * pBitmapData = m_dib.GetData();
// LPBITMAPINFO pBitmapInfo = m_dib.GetInfo();
// int bitmapwidth = m_dib.GetWidth();
// int bitmapheight = m_dib.GetHeight();
ScaledWidth = (int)(m_dib.GetWidth()*m_scale);
ScaledHeight = (int)(m_dib.GetHeight()*m_scale);
m_palette = CreateBitmapPalette(&m_dib);
Invalidate();
}
//转置
void CExam7View::OnTran()
{
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
// TODO: Add your command handler code here
//获得图像的宽度和高度
LONG wide = m_dib.GetWidth();
LONG height = m_dib.GetHeight();
//原图一行字节数
LONG lLineBytes = (((wide*8)+31)/32*4);
//新图一行字节数
LONG lNewLineBytes = (((height*8)+31)/32*4);
//获得位图数据区指针
LPBYTE p_data = m_dib.GetData();
LPBYTE lpSrc,lpDst;
LPBYTE pTemp;
int i,j;
//为临时空间,分配空间
pTemp = new BYTE[wide*lNewLineBytes];
//a[i][j] = b[j][i]
for(j=0;jbiHeight = wide;
m_dib.m_pBitmapInfoHeader->biWidth = height;
//拷贝内存
memcpy(p_data,pTemp,wide*height);
//计算输出图像宽度和高度
ScaledWidth = (int)(m_dib.GetWidth()*m_scale);
ScaledHeight = (int)(m_dib.GetHeight()*m_scale);
Invalidate();
delete pTemp;
}
void CExam7View::OnZft()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
AfxMessageBox("没有图像!");
return;
}
CZFT dlg;
float a[256];
int i;
LONG lMaxCount;
this->GetProbability(a);
//记录最大值
for(i=0;i<256;i++)
{
if(a[i]>lMaxCount)
lMaxCount = (LONG)a[i];
}
for(i=0;i<256;i++)
{
a[i] = a[i]*256/lMaxCount;
}
memcpy(dlg.num,a,256*sizeof(float));
dlg.m_MaxCount = lMaxCount;
dlg.DoModal();
}
void CExam7View::OnErzhi()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
BYTE GrayValue;
RGBQUAD *pRGB;
pRGB = m_dib.GetRGB();
for(unsigned int i=0;i< m_dib.GetNumberOfColors();i++)
{
//加权平均
GrayValue = (BYTE)(pRGB[i].rgbRed*0.3+pRGB[i].rgbGreen*0.59+pRGB[i].rgbBlue*0.11);
if(GrayValue>100)
pRGB[i].rgbRed = pRGB[i].rgbGreen = pRGB[i].rgbBlue = 255;
else
pRGB[i].rgbRed = pRGB[i].rgbGreen = pRGB[i].rgbBlue = 0;
}
Invalidate();
}
void CExam7View::OnUpdateErzhi(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid()&&m_bGray)
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
//灰度化
void CExam7View::OnGray()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
AfxMessageBox("没有图像!");
return;
}
CExam7Doc *pDoc = GetDocument();
// LPBYTE p_data;
LPBYTE lpSrc;
//灰度映射表
BYTE bGrayMap[256];
//循环变量
int i;
LONG ih;
LONG iw;
//图像宽度和高度
LONG lWidth;
LONG lHeight;
LONG OneLineBytes;
LPBITMAPINFO lpbmi;//(win3.0)
LPBITMAPCOREINFO lpbmc;//(OS/2)
lpbmi = (LPBITMAPINFO)m_dib.pDib;
lpbmc = (LPBITMAPCOREINFO)m_dib.pDib;
if(m_dib.GetNumberOfColors()!=256)
{
MessageBox("不是256色图!","警告!",MB_ICONWARNING);
return;
}
BeginWaitCursor();
for(i=0;i<256;i++)
{
if(((*(LPDWORD)(m_dib.pDib)) == sizeof(BITMAPINFOHEADER)))
{
bGrayMap[i] = (BYTE)(lpbmi->bmiColors[i].rgbRed*0.3+
lpbmi->bmiColors[i].rgbGreen*0.59+
lpbmi->bmiColors[i].rgbBlue*0.11);
lpbmi->bmiColors[i].rgbRed = i;
lpbmi->bmiColors[i].rgbGreen = i;
lpbmi->bmiColors[i].rgbBlue = i;
lpbmi->bmiColors[i].rgbReserved = 0;
}
else
{
bGrayMap[i] = (BYTE)(lpbmc->bmciColors[i].rgbtRed*0.3+
lpbmc->bmciColors[i].rgbtGreen*0.59+
lpbmc->bmciColors[i].rgbtBlue*0.11);
lpbmc->bmciColors[i].rgbtRed = i;
lpbmc->bmciColors[i].rgbtGreen = i;
lpbmc->bmciColors[i].rgbtBlue = i;
}
}
lWidth = m_dib.GetWidth();
lHeight = m_dib.GetHeight();
OneLineBytes = (((lWidth*8)+31)/32*4);
//更换每个像素的索引号
for(ih=0;ihSetPaletteEntries(0,256,(LPPALETTEENTRY)lpbmi->bmiColors);
//OnDoRealize(
// pDoc->GetDocPalette()->SetPaletteEntries(0,256,(LPPALETTEENTRY)lpbmi->bmiColors);
// BYTE GrayValue;
/* RGBQUAD *pRGB;
pRGB = m_dib.GetRGB();
for(unsigned int i=0;i< m_dib.GetNumberOfColors();i++)
{
//加权平均
GrayValue = (BYTE)(pRGB[i].rgbRed*0.3+pRGB[i].rgbGreen*0.59+pRGB[i].rgbBlue*0.11);
pRGB[i].rgbRed = pRGB[i].rgbGreen = pRGB[i].rgbBlue = GrayValue;
}*/
EndWaitCursor();
m_bGray = true;
Invalidate();
}
//////////
void CExam7View::OnUpdateGray(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid())
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateZft(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_bGray)
{
pCmdUI->Enable(true);
pCmdUI->SetText("直方图");
}
else
{
pCmdUI->Enable(false);
pCmdUI->SetText("直方图(不是灰度图!)");
}
}
//平移
void CExam7View::OnMove()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
CMove dlg;
if(dlg.DoModal()==IDOK)
{
m_x = m_x+dlg.m_x;
m_y = m_y+dlg.m_y;
}
Invalidate();
}
//镜像
void CExam7View::OnMirror()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
CMirror dlg;
LONG wide = m_dib.GetWidth();
LONG height = m_dib.GetHeight();
LONG OneRowBytes = (((wide*8)+31)/32*4);
LONG OneLineBytes = (((height*8)+31)/32*4);
int i,j;
LPBYTE p_data = m_dib.GetData();
LPBYTE pTemp = new BYTE[OneRowBytes*OneLineBytes];
LPBYTE lpSrc,lpDst;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_bH)
{
for(i=0;ibiBitCount==8)
{
for(int i=0;ibiWidth = newwide;
m_dib.m_pBitmapInfoHeader->biHeight = newheight;
ScaledHeight = (int)(newheight*m_scale);
ScaledWidth = (int)(newwide*m_scale);
memcpy(p_data,pTemp,newwide*newheight);
//m_dib.m_pData=pTemp;
}
else
{
MessageBox("不能处理!可能不是8位图!","警告!",MB_ICONWARNING);
}
delete pTemp;
Invalidate();
}
void CExam7View::OnBigger()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
m_scale = m_scale+0.1;
ScaledWidth = (int)(m_scale*m_dib.GetWidth());
ScaledHeight = (int)(m_scale*m_dib.GetHeight());
Invalidate();
}
void CExam7View::OnSmaller()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
if(m_scale>0)
{
m_scale = m_scale-0.1;
ScaledWidth = (int)(m_scale*m_dib.GetWidth());
ScaledHeight = (int)(m_scale*m_dib.GetHeight());
}
Invalidate();
}
//灰度的线性拉伸
void CExam7View::OnGraylinetrans()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
int nX1,nY1,nX2,nY2;
CDlgGray dlg;
if(dlg.DoModal()==IDOK)
{
nX1 = dlg.m_nX1;
nY1 = dlg.m_nY1;
nX2 = dlg.m_nX2;
nY2 = dlg.m_nY2;
}
else
return;
LONG width = m_dib.GetWidth();
LONG height = m_dib.GetHeight();
LPBYTE lpSrc;
int i,j;
//
BYTE bGrayMap[256];
LONG OneLineBytes = ((width*8)+31)/32*4;
for(i=0;i0)
{
bGrayMap[i] = (BYTE)(nY1*i/nX1);
}
else
{
bGrayMap[i] = 0;
}
}
for(;ilMaxCount)
lMaxCount = (LONG)a[i];
}
for(i=0;i<256;i++)
{
a[i] = a[i]*256/lMaxCount;
}*/
}
//直方图均衡化
void CExam7View::OnZftpoise()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
LONG i,j;
LONG width = m_dib.GetWidth();
LONG height = m_dib.GetHeight();
//灰度分布
float fps_R[256];
//中间变量
float temp_R[256];
int nNs_R[256];
memset(temp_R,0,sizeof(temp_R));///////////???
LPBYTE p_data = m_dib.GetData();
this->GetProbability(fps_R);
for(i =0;i<256;i++)
{
fps_R[i] = fps_R[i]/(width*height);
}
for(i=0;i<256;i++)
{
if(i==0)
{
temp_R[0] = fps_R[0];
}
else
{
temp_R[i] = temp_R[i-1] + fps_R[i];
}
nNs_R[i] = (int)(255.0f * temp_R[i] + 0.5f);
}
//si = n1/n + n2/n + … +ni/n;
for(i=0;ivalue[y])
{
temp = value[x];
value[x] = value[y];
value[y] = temp;
}
}
}
pTemp[width * i + j] = value[4];
}
}
memcpy(p_data, pTemp, size);
Invalidate();
delete pTemp;
}
void CExam7View::OnUpdateTran(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid())
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateMove(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid())
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateMirror(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid())
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateRotate(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid())
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateBigger(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid())
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateSmaller(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid())
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateGraylinetrans(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid()&&m_bGray)
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateZftpoise(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid()&&m_bGray)
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateAveragefilter(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid()&&m_bGray)
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnUpdateMidfilter(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_dib.IsValid()&&m_bGray)
{
pCmdUI->Enable();
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnContrarycolor()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
LONG i,j;
LONG width = m_dib.GetWidth();
LONG height = m_dib.GetHeight();
LPBYTE p_data = m_dib.GetData();
for(i=0;iEnable(true);
}
else
{
pCmdUI->Enable(false);
}
}
void CExam7View::OnHighfliter()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
LONG width = m_dib.GetWidth();
LONG height = m_dib.GetHeight();
LONG i, j;
LONG OneLineBytes = ((width*8)+31)/32*4;
LPBYTE p_data = m_dib.GetData();
LPBYTE pTemp = new BYTE[OneLineBytes * height];
for(i=1;i255)
*((LPBYTE)pTemp + i * OneLineBytes + j) = 255;
else
*((LPBYTE)pTemp + i * OneLineBytes + j) = temp;
}
}
memcpy(p_data,pTemp,OneLineBytes*height);
Invalidate();
delete pTemp;
}
void CExam7View::OnCanvas()
{
// TODO: Add your command handler code here
if(!m_dib.IsValid())
{
MessageBox("没有图像!","警告!",MB_ICONWARNING);
return;
}
LONG width = m_dib.GetWidth();
LONG height = m_dib.GetHeight();
LONG i, j;
LONG OneLineBytes = ((width*8)+31)/32*4;
LPBYTE p_data = m_dib.GetData();
LPBYTE pTemp = new BYTE[OneLineBytes * height];
int di, dj;
for(i=1;i