📄 bsview.cpp
字号:
// bsView.cpp : implementation of the CBsView class
//
#include "stdafx.h"
#include "bs.h"
#include "bsDoc.h"
#include "bsView.h"
#include "Dib.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBsView
IMPLEMENT_DYNCREATE(CBsView, CView)
BEGIN_MESSAGE_MAP(CBsView, CView)
//{{AFX_MSG_MAP(CBsView)
ON_COMMAND(ID_OPERATE, OnOperate)
ON_COMMAND(ID_FILE_OPENB, OnFileOpenb)
ON_COMMAND(ID_FILE_OPENO, OnFileOpeno)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CBsView construction/destruction
#define WIDTH(bytes) (((bytes*8+31)/32)*4)
#define WIDETHBYTES(i) ((i+31)/32*4)
CBsView::CBsView()
{
// TODO: add construction code here
valid=false;
}
CBsView::~CBsView()
{
}
BOOL CBsView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CBsView drawing
void CBsView::OnDraw(CDC* pDC)
{
CBsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(valid)
{
int m_scale=1;//控制缩放比例
BYTE *pBmpData=dib->GetData();
LPBITMAPINFO pBmpInfo=dib->GetInfo();
int bmpHeight=dib->GetHeight();
int bmpWidth=dib->GetWidth();
int scaleHeight=(int)(m_scale*bmpHeight);
int scaleWidth=(int)(m_scale*bmpWidth);
if(dib->GetRGB())
{
CPalette *hPalette=dib->CreateBmpPalette();
CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
pDC->RealizePalette();
::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
pDC->SelectPalette(hOldPalette,true);
::DeleteObject(hPalette);
}
::StretchDIBits(pDC->GetSafeHdc(),0,0,scaleWidth,scaleHeight,0,0,bmpWidth,bmpHeight,
pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);
}
}
/////////////////////////////////////////////////////////////////////////////
// CBsView printing
BOOL CBsView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CBsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CBsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CBsView diagnostics
#ifdef _DEBUG
void CBsView::AssertValid() const
{
CView::AssertValid();
}
void CBsView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CBsDoc* CBsView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBsDoc)));
return (CBsDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBsView message handlers
/*void CBsView::Sub(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height,int bitcount)
{
int i,j,k,wh;
LPBYTE lpSrc[3];//原图像像素指针
LPBYTE lpDst[3];//目标像素指针
LPBYTE lpSrcBK[3];//背景像素指针
wh=WIDETHBYTES(wide*bitcount);
LPBYTE temp=new BYTE[height*wh];//新图像缓冲区
memset(temp,255,height*wh);//初始化新分配的内存为255
for(j=0;j<height;j++)//进行每个像素的减运算
{
for(i=0;i<wh/3;i++)
//获得原像素指针
{
for(k=0;k<3;k++)
{
lpSrc[k]=p_data+(wh*j+i*3+k);
//获得目标像素指针
lpDst[k]=temp+(wh*j+i*3+k);
//获得背景像素指针
lpSrcBK[k]=p_dataBK+(wh*j+i*3+k);
}
//进行减运算
if(fabs(*lpSrc[0]-*lpSrcBK[0])<25&&fabs(*lpSrc[1]-*lpSrcBK[1])<25&&fabs(*lpSrc[2]-*lpSrcBK[2])<25)
{ *lpDst[0]=0;
*lpDst[1]=0;
*lpDst[2]=0;
}
else
{ *lpDst[0]=255;
*lpDst[1]=255;
*lpDst[2]=255;
}
}
}
memcpy(p_data,temp,height*wh);//复制处理后的图像
delete temp;
}*/
void CBsView::Sub(BYTE *p_data, BYTE *p_dataBK,int wide,int height,DWORD size)
{
int i,j,r;
LPBYTE lpSrc;//原图像像素指针
LPBYTE lpDst=new BYTE[size];//目标像素指针
LPBYTE lpSrcBK;//背景像素指针
LPBYTE temp=new BYTE[3];//新图像缓冲区
memset(lpDst,255,size);//初始化新分配的内存为255
memset(temp,255,3);
for(j=0;j<height;j++)//进行每个像素的减运算
{
r=0;//用于判断是否是象素的起始字节
for(i=0;i<WIDTH(3*wide);i++)
{
r++;
//获得原像素指针
lpSrc=p_data+WIDTH(3*wide)*j+i;
//获得目标像素指针
// lpDst=temp+wide*j+i;
//获得背景像素指针
lpSrcBK=p_dataBK+WIDTH(3*wide)*j+i;
temp[r%3]=*lpSrc-*lpSrcBK;
//进行减运算
if(r%3==0)
{
// if(temp[0]==0||temp[1]==0||temp[2]==0)
if(fabs(temp[0])<25||fabs(temp[1])<25||fabs(temp[2])<25)
{
lpDst[WIDTH(3*wide)*j+i]=0;
lpDst[WIDTH(3*wide)*j+i-1]=0;
lpDst[WIDTH(3*wide)*j+i-2]=0;
}
else
{
lpDst[WIDTH(3*wide)*j+i]=255;
lpDst[WIDTH(3*wide)*j+i-1]=255;
lpDst[WIDTH(3*wide)*j+i-2]=255;
}
}
}
}
memcpy(p_data,lpDst,size);//复制处理后的图像
delete temp,lpDst;
}
void CBsView::OnOperate()
{
// Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),(dib2.m_pBitmapInfoHeader)->biBitCount);
Sub(dib1.m_pData,dib2.m_pData,dib2.GetWidth(),dib2.GetHeight(),dib2.GetSize());
dib=&dib1;
mid(dib,3);
valid=true;
Invalidate(); //更新 OnDraw()函数
}
void CBsView::OnFileOpenb()
{
CFileDialog dlg2(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL); //设置打开文件为“ .TXT”
// CFileDialog dlg2( TRUE,_T("TXT"),_T("*.TXT"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T(" 文本文件 (*.TXT)|*.TXT|"));
if(IDOK==dlg2.DoModal())
{
dib2.LoadFile(dlg2.GetPathName());
dib=&dib2;
valid=true;
Invalidate(); }//更新 OnDraw()函数
}
void CBsView::OnFileOpeno()
{
CFileDialog dlg1(TRUE,".bmp|*.*",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位图文件(*.bmp)|*.bmp|All Files (*.*)|*.*||",NULL); //设置打开文件为“ .TXT”
if(IDOK==dlg1.DoModal())
{
dib1.LoadFile(dlg1.GetPathName());
dib=&dib1;
valid=true;
Invalidate();} //更新 OnDraw()函数
}
void CBsView::mid(CDib *dib0,int n)
{//n为窗口的边长
DWORD size;
size=dib0->GetSize();//得到图像的大小,以字节为单位
int ywindow,xwindow,nhalf,nn,m,k,chg,winm,mid0,win[1000];
BYTE *p_data;//原图像象素指针
int wide,height;
BYTE *p_temp=new BYTE[size];//
nhalf=(n-1)/2;//求出窗口一半的长度
nn=n*n;//窗口大小
mid0=(nn-1)/2;//用于存放求出的中值
p_data=dib0->GetData();//取得原图的数据区指针
memset(p_temp,255,size);
wide=dib0->GetWidth();//取得原图的数据区宽
height=dib0->GetHeight();
for(int j=nhalf;j<height-nhalf;j++)//窗口中心象素的起始位置
for(int i=nhalf;i<wide-nhalf;i++)
{
//把N*N屏蔽窗口部分复制到mode[m]
m=0;
for(ywindow=j-nhalf;ywindow<=j+nhalf;ywindow++)//窗口内的象素
for(xwindow=i-nhalf;xwindow<=i+nhalf;xwindow++)
{
for(k=0;k<3;k++)
{
win[3*m+k]=p_data[(ywindow*WIDTH(3*wide)+3*xwindow)+k];
}
m++;
}
do{
chg=0;
for(m=0;m<nn-1;m++)
{
if(win[3*m]>win[3*(m+1)]||win[3*m+1]>win[3*(m+1)+1]||win[3*m+2]>win[3*(m+1)+2])
{
for(k=0;k<3;k++)
{
winm=win[3*m+k];
win[3*m+k]=win[3*(m+1)+k];
win[3*(m+1)+k]=winm;
}
chg=1;
}
}
}while(chg==1);
for(k=0;k<3;k++)
{
p_temp[j*WIDTH(3*wide)+3*i+k]=win[3*mid0+k];
}
}
memcpy(p_data,p_temp,size);
delete p_temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -