二维数组转为图像

xmhy66 2012-04-22 03:30:41
现在做一个功率谱显示的程序,用到要把1000*500的WORD类型二维数组转为BITMAP,其中数组中存储颜色索引值。程序每100ms接收一行新数据并进行循环刷新显示,也就是原499行数据是不变的,只是在二维数组的最后添加一行新数据,删除其原来的第一行数据。现在的问题是程序能运行,但反应很慢。不知该如何优化。我的设想是每次将新的数据生成的图像与原图进行拼接,这样就不用刷新原来的499行元素,只刷新新的一行就可以了。但不知道具体该如何实现。
下面为我写的代码:

void CGraghCtrl::DrawSpectrogram(CDC* pDC)//绘制瀑布图
{

for(int i=0;i<vctPubu.size();i++)
{
for(int j=0;j<vctPubu[i].size();j++)
{
COLORREF yColor=Data2Color(vctPubu[i][j]);
CPen pen(PS_SOLID, 2, yColor);
pDC->SelectObject(&pen);
pDC->MoveTo(ColxToScreen(j), ColyToScreen(i));
pDC->LineTo(ColxToScreen(j+1), ColyToScreen(i));
}
}

}

其中vctPubu中为存储颜色索引的二维vector,Data2Color()为自定义的word转Color的函数。这段代码直接在onpaint中调用:

// 消息响应函数
void CGraghCtrl::OnPaint()
{
WaveMiddle=(m_rcClient.Height()- m_layout.page.nBottomMargin-m_layout.page.nTopMargin)/2;
CPaintDC dc(this);
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象

MemDC.CreateCompatibleDC(&dc);//随后建立与屏幕显示兼容的内存显示设备
MemBitmap.CreateCompatibleBitmap(&dc,m_rcClient.Width(),m_rcClient.Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
DrawSpectrogram(&MemDC);// 这个函数完成图形的绘制
dc.BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), &MemDC, 0, 0, SRCCOPY);//将内存中的图拷贝到屏幕上进行显示
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}

恳请大侠帮忙
...全文
715 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-05-03
  • 打赏
  • 举报
回复
应考虑用循环Buffer结构和API BitBlt
shinidge 2012-05-03
  • 打赏
  • 举报
回复
内存拷贝么?memcpy
xmhy66 2012-04-23
  • 打赏
  • 举报
回复
谢谢shinidge回答,具体怎么弄呢,我对内存操作不熟啊
shinidge 2012-04-22
  • 打赏
  • 举报
回复
你用个相同的结构把它拷贝一份,缓存起来不就行了么

64,327

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧