|
用vc6写的一个简易串口工具,可以通过串口输入的数据(如: 一个像素点(0x12,0xf0)(0x13,0x13) )生成保存图片到程序目录下格式:320*240 ,160*120,80*60都可以
数据多了电脑容易卡死,可能是vc串口模块占用CPU导致
若是有需要会贴上代码
串口传图工具.rar
(6.18 MB, 下载次数: 13)
//********************遍历逐个像素改变图像******************
UpdateData(TRUE); //更新所有编辑框的数据,存入变量
CString imgstr;
for(int y=0;y<m_height;y++) //y<src->height
{
unsigned char *bslImgData = (unsigned char *)(src->imageData+y*src->widthStep); //图像src第y行
for(int x=0;x<m_width;x++) //图像第x列 src->width
imgstr+=bslImgData[3*x+0]/2;
}
m_com.SetOutput(COleVariant(imgstr)); //将字符串发送出去,因是char型,单字节的值不大于127(0x7f);
imgstr.Empty(); //清空数据
cvDestroyWindow("disp");
}
}
//********************保存图像******************
void CMyDlg::OnSaveimg()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //更新所有编辑框的数据,存入变量
IplImage *img = cvCreateImage(cvSize(m_width,m_height),8,3); //默认为三通道图像宽100,高108
next=0;
CByteArray hexdata;
int len = String2Hex(m_recmsg, hexdata);
m_recmsg.Empty(); //清空接收缓存
SetDlgItemText(IDC_RECMSG,m_recmsg); //清空接收框
BYTE temp=0,temp2=0;
for(int v=0;v<img->height;v++)
{
unsigned char *imgdat = (unsigned char *)(img->imageData+v*img->widthStep); //图像img第y行
for(int w=0;w<img->width;w++) //图像第x列
{//接收RGB565数据,数据格式为2byte数据,分别是5位b,6位g,5位r,共同组成
imgdat[w*3+0] = savimg[next]&0xf8; //取rgb565的r红色
imgdat[w*3+1] =(savimg[next]&0x07)<<5;
next++;
imgdat[w*3+1] |=(savimg[next]&0xe0)>>3; //取rgb565中间b绿色
imgdat[w*3+2] = (savimg[next]&0x1f)<<3; //取rgb565的b蓝色
//imgdat[w*3+0] = imgdat[w*3+2] = imgdat[w*3+1]; 取蓝色作为灰图显示
next++;
if(len==next)break;
}
}
savimg.Empty(); //清空数据
//*********************获取系统时间保存图片****************
CTime time;
char szTime[100];
time = CTime::GetCurrentTime();
sprintf(szTime,"%4d%.2d%.2d%.2d%.2d%.2d%s",time.GetYear(),time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond(),".jpg");
cvSaveImage(szTime,img); //保存串口收到的图像
AfxMessageBox("保存成功!");
cvNamedWindow("disp");
cvShowImage("disp",img);
cvWaitKey(0);
cvDestroyWindow("disp");
}
|
|