二维数组转为图像
现在做一个功率谱显示的程序,用到要把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();
}
恳请大侠帮忙