📄 imagedisview.cpp
字号:
// ImageDisView.cpp : implementation of the CImageDisView class
//
#include "stdafx.h"
#include "ImageDis.h"
#include "ImageDisDoc.h"
#include "ImageDisView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImageDisView
IMPLEMENT_DYNCREATE(CImageDisView, CView)
BEGIN_MESSAGE_MAP(CImageDisView, CView)
//{{AFX_MSG_MAP(CImageDisView)
ON_COMMAND(ID_OPEN_PORT, OnOpenPort)
ON_WM_CREATE()
ON_COMMAND(ID_DIS_IMAGE, OnDisImage)
ON_COMMAND(ID_MENU_CHAZHI, OnMenuChazhi)
ON_COMMAND(ID_INI_IMAGE, OnIniImage)
ON_COMMAND(ID_SAVE_IMAGE, OnSaveImage)
ON_UPDATE_COMMAND_UI(IDR_COM_INF,OnUpdateCom)
ON_UPDATE_COMMAND_UI(ID_COM_DATA_NUM,OnUpdateComData)
ON_COMMAND(ID_INI_COLOR_IMAGE, OnIniColorImage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CImageDisView, CView)
//{{AFX_EVENTSINK_MAP(CAboutDlg)
ON_EVENT(CImageDisView, IDC_MSCOMM1, 1 , OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageDisView construction/destruction
CImageDisView::CImageDisView()
{
// TODO: add construction code here
m_ptrData=NULL;
m_ptrDisMemory=NULL;
m_ptrInteData=NULL;
m_bPortOpen=false;
m_strChuankou="";
m_intDataCount=0;
m_bSingleEnd=false;
m_nxPos=401;
m_nyPos=0;
m_nScount=0;
m_bIniColorImage=false;
}
void CImageDisView::OnUpdateCom(CCmdUI *pCmdUI)
{
CString s;
if(m_bPortOpen)
{
if(m_nComNum==1) s.Format("COM1:Open,%d,8,n,1",m_nBaud);
if(m_nComNum==2) s.Format("COM2:Open,%d,8,n,1",m_nBaud);
pCmdUI->SetText(s);
}
}
void CImageDisView::OnUpdateComData(CCmdUI *pCmdUI)
{
CString s;
float m=0;
int m1=0;
if(m_bPortOpen)
{
m=100*(float)m_intDataCount/(float)(m_nRowNum*m_nColumnNum);
m1=m;
s.Format("进度: %d/100",m1);
pCmdUI->SetText(s);
}
}
CImageDisView::~CImageDisView()
{
if(m_ptrData!=NULL) delete m_ptrData;
if(m_ptrDisMemory!=NULL) delete m_ptrDisMemory;
if(m_ptrInteData!=NULL) delete m_ptrInteData;
}
BOOL CImageDisView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageDisView drawing
void CImageDisView::OnDraw(CDC* pDC)
{
CImageDisDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
_disbmp(m_bPortOpen,pDC);
_texttoview();
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CImageDisView diagnostics
#ifdef _DEBUG
void CImageDisView::AssertValid() const
{
CView::AssertValid();
}
void CImageDisView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CImageDisDoc* CImageDisView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDisDoc)));
return (CImageDisDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageDisView message handlers
void CImageDisView::OnOpenPort()
{
CDlgPortSetClass pdlg;
int nComNum=0;
int nBaud=0;
int nRowOrColu=0;
int nRowNum=0;
int nColumnNum=0;
int nFrame=0;
CString ss;
if(pdlg.DoModal()==IDOK)
{
nComNum=pdlg.m_nComNum;
nBaud=pdlg.m_nBaud;
nRowOrColu=pdlg.m_nRowOrColu;
nRowNum=pdlg.m_nRowNum;
nColumnNum=pdlg.m_nColumnNum;
nFrame=pdlg.m_nFrame;
//判断
m_nComNum=nComNum+1;
if(nBaud==id_baud_9600) m_nBaud=9600;
if(nBaud==id_baud_19200) m_nBaud=19200;
m_nRowOrColu=nRowOrColu;
m_nRowNum=nRowNum;
m_nColumnNum=nColumnNum;
m_nFrame=nFrame;
//
if(m_nRowNum>0&&m_nColumnNum>0)
{
int row=0,column=0;
int len=0;
len=m_nRowNum*m_nColumnNum;
m_ptrData=new BYTE[len];
memset(m_ptrData,0,len);
len=3*m_nRowNum*m_nColumnNum;
m_ptrInteData=new BYTE[len];
memset(m_ptrInteData,0,len);
len=3*m_nRowNum*m_nColumnNum+54;
m_ptrDisMemory=new BYTE[len];
memset(m_ptrDisMemory,0,len);
//构造信息头
m_pBmpFile.bfType=19778;
m_pBmpFile.bfSize=m_nRowNum*m_nColumnNum;
m_pBmpFile.bfReserved1=0;
m_pBmpFile.bfReserved2=0;
m_pBmpFile.bfOffBits=54;
m_pBmpInf.biSize=40;
m_pBmpInf.biWidth=m_nColumnNum;
m_pBmpInf.biHeight=m_nRowNum;
m_pBmpInf.biPlanes=1;
m_pBmpInf.biBitCount=24;
m_pBmpInf.biCompression=0;
m_pBmpInf.biSizeImage=m_nRowNum*m_nColumnNum;
m_pBmpInf.biXPelsPerMeter=0;
m_pBmpInf.biYPelsPerMeter=0;
m_pBmpInf.biClrUsed=0;
m_pBmpInf.biClrImportant=0;
BYTE* pg=(BYTE*)&m_pBmpFile;
for(int k=0;k<14;k++)
{m_ptrDisMemory[k]=pg[k];}
pg=(BYTE*)&m_pBmpInf;
for(k=0;k<40;k++)
{m_ptrDisMemory[k+14]=pg[k];}
m_bPortOpen=true;
Invalidate();
}
m_MSComm.Create(NULL,0,CRect(0,0,0,0),this,IDC_MSCOMM1);
if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
m_MSComm.SetPortOpen(FALSE);
m_MSComm.SetCommPort(m_nComNum); //选择COM2
m_MSComm.SetInBufferSize(1024); //接收缓冲区
m_MSComm.SetOutBufferSize(1024);//发送缓冲区
m_MSComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_MSComm.SetInputMode(1);//以二进制方式读写数据
m_MSComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
ss.Format("%d,n,8,1",m_nBaud);
//m_MSComm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
m_MSComm.SetSettings(ss);
if(!m_MSComm.GetPortOpen())//如果串口没有打开则打开
m_MSComm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("Open Serial Port Failure!");
m_MSComm.GetInput(); //先预读缓冲区以清除残留数据
}
}
int CImageDisView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
/*
m_MSComm.Create(NULL,0,CRect(0,0,0,0),this,IDC_MSCOMM1);
if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
m_MSComm.SetPortOpen(FALSE);
m_MSComm.SetCommPort(2); //选择COM2
m_MSComm.SetInBufferSize(1024); //接收缓冲区
m_MSComm.SetOutBufferSize(1024);//发送缓冲区
m_MSComm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_MSComm.SetInputMode(1);//以二进制方式读写数据
m_MSComm.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_MSComm.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
if(!m_MSComm.GetPortOpen())//如果串口没有打开则打开
m_MSComm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("Open Serial Port Failure!");
m_MSComm.GetInput(); //先预读缓冲区以清除残留数据
*/
}
void CImageDisView::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
long k,len;
int m_cot=0;
//BYTE rxdata[2048];
BYTE rxdata[490000];
CString strtemp;
CString sHex;
if(m_MSComm.GetCommEvent()==id_recive_data)
{
variant_inp=m_MSComm.GetInput();
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
m_strChuankou=m_strChuankou+strtemp+" "; //加入接收编辑框对应字符串
char s0,s1; //t3,t2,t1,t0依次为存储一个字符串从左至右每个位上字符的字符变量
int T0,T1; // T0,T1,T2,T3分别为t3,t2,t1,t0所对应的十进制数
unsigned int T; // T 为合并完成的十进制数
s1=strtemp.GetAt(0); // 把16进制字符串的第一个字符存放到t1里
T1=Hex_To_Dec(s1); // 把16进制数转化成相应的10进制数
//把10进制数存到T1里
s0=strtemp.GetAt(1);
T0=Hex_To_Dec(s0);
T=(T1*16+T0); // T存储转化完成的十进制数
///记录数据
if(T==255)
{m_intDataCount=0;m_strChuankou="";}
else
{
if(m_nScount==0&&m_nFrame==id_single_frame)
{
if(m_intDataCount<m_nColumnNum*m_nRowNum) m_ptrData[m_intDataCount]=T;
m_intDataCount++;
if(m_intDataCount==m_nColumnNum*m_nRowNum)
{
m_bSingleEnd=true;
m_nScount=1;
Invalidate();
}
}
if(m_nFrame==id_multi_frame)
{
if(m_intDataCount<m_nColumnNum*m_nRowNum) m_ptrData[m_intDataCount]=T;
m_intDataCount++;
if(m_intDataCount==m_nColumnNum*m_nRowNum)
{
m_bSingleEnd=true;
Invalidate();
}
}
}
}
}
}
void CImageDisView::_disbmp(bool bPortOpen,CDC *pDC)
{
if(bPortOpen)
{
int nXPos=0;
int nYPos=0;
long width=m_nColumnNum;
long height=m_nRowNum;
long nBytesPerRow=width*3;
BYTE C=0;
LPBITMAPINFO ptrInf=(LPBITMAPINFO)&m_pBmpInf;
if(!m_bIniColorImage)
{
for(int row=0;row<m_nRowNum;row++)
for(int column=0;column<m_nColumnNum;column++)
{
C=m_ptrData[row*m_nColumnNum+column];
m_ptrInteData[row*nBytesPerRow+3*column+0]=C;
m_ptrInteData[row*nBytesPerRow+3*column+1]=C;
m_ptrInteData[row*nBytesPerRow+3*column+2]=C;
}
}
StretchDIBits(pDC->m_hDC,0,0,width+nXPos,height-nYPos,nXPos,0,width+nXPos,height-nYPos,(void*)m_ptrInteData,ptrInf,DIB_RGB_COLORS,SRCCOPY);
}
}
void CImageDisView::_texttoview()
{
CClientDC dc(this);
int len=0;
int m=0;
CString ss;
CString ss1;
int row=0,column=0;
dc.MoveTo(400,0);
dc.LineTo(400,800);
if(m_bSingleEnd)
{
for(row=0;row<m_nRowNum;row++)
for(column=0;column<m_nColumnNum;column++)
{
m=m_ptrData[row*m_nColumnNum+column];
ss.Format("%02x ",m+"%");
dc.TextOut(401+20*column,20*row,ss);
}
m_bSingleEnd=false;
}
}
int CImageDisView::Hex_To_Dec(char ss)
{
int nDec=0;
if (ss=='0')
nDec=0;
else if (ss=='1')
nDec=1;
else if (ss=='2')
nDec=2;
else if (ss=='3')
nDec=3;
else if (ss=='4')
nDec=4;
else if (ss=='5')
nDec=5;
else if (ss=='6')
nDec=6;
else if (ss=='7')
nDec=7;
else if (ss=='8')
nDec=8;
else if (ss=='9')
nDec=9;
else if (ss=='A')
nDec=10;
else if (ss=='B')
nDec=11;
else if (ss=='C')
nDec=12;
else if (ss=='D')
nDec=13;
else if (ss=='E')
nDec=14;
else
nDec=15;
return nDec;
}
void CImageDisView::OnDisImage()
{
// TODO: Add your command handler code here
Invalidate();
}
void CImageDisView::OnMenuChazhi()
{
int row=0,column=0;
int columnEge=0;
int rowEge=0;
BYTE R=0,G=0,B=0;
int nBytesPerRow=m_nColumnNum*3;
int x=0,y=0;
int x0=0,y0=0;
int c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0;
if(m_nRowOrColu==id_odd)
{
//奇奇
columnEge=(m_nColumnNum-3)/2;
rowEge=(m_nRowNum-3)/2;
for(row=0;row<rowEge;row++)
for(column=0;column<columnEge;column++)
{
//获得8临域
//处理蓝色分量(2n+1,2n+1)
x0=2*column+1;
y0=2*row+1;
B=m_ptrData[y0*m_nColumnNum+x0];
x=x0-1;
y=y0-1;
c1=m_ptrData[y*m_nColumnNum+x];//R
x=x0-1;
y=y0;
c2=m_ptrData[y*m_nColumnNum+x];//G
x=x0-1;
y=y0+1;
c3=m_ptrData[y*m_nColumnNum+x];//R
x=x0;
y=y0-1;
c4=m_ptrData[y*m_nColumnNum+x];//G
x=x0;
y=y0+1;
c5=m_ptrData[y*m_nColumnNum+x];//G
x=x0+1;
y=y0-1;
c6=m_ptrData[y*m_nColumnNum+x];//R
x=x0+1;
y=y0;
c7=m_ptrData[y*m_nColumnNum+x];//G
x=x0+1;
y=y0+1;
c8=m_ptrData[y*m_nColumnNum+x];//R
R=(c1+c3+c6+c8)/4;
G=(c2+c4+c5+c7)/4;
B=B;
m_ptrInteData[y0*nBytesPerRow+3*x0+0]=B;
m_ptrInteData[y0*nBytesPerRow+3*x0+1]=G;
m_ptrInteData[y0*nBytesPerRow+3*x0+2]=R;
}
for(row=0;row<rowEge;row++)
for(column=0;column<columnEge;column++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -