1个回答
展开全部
前次看到你的提问了,你的描述和需求太含混了,不好回答。
转换灰度图并保存BMP格式,其实存储还是一个RGB值,只是三色相同的RGB,BMP没有灰度的特殊存储方法(GIF等格式有)转换算法网上很多,这里就不复制了。
至于像素对应。。。能具体一些么。本身你有一个二维数组数据y[i][j],那么转换后放到另一个数组z[i][j]里面就可以和原图对应了,对应应该不是问题。
至于存储,MFC有很多方法,比如自己写像素点和bm文件头,比如通过DC进行HBITMAP操作,获得一个标准位图数据再保存,比如用CImage保存等等,不同方式处理都有差别,需要的技巧也不相同。
转换灰度图并保存BMP格式,其实存储还是一个RGB值,只是三色相同的RGB,BMP没有灰度的特殊存储方法(GIF等格式有)转换算法网上很多,这里就不复制了。
至于像素对应。。。能具体一些么。本身你有一个二维数组数据y[i][j],那么转换后放到另一个数组z[i][j]里面就可以和原图对应了,对应应该不是问题。
至于存储,MFC有很多方法,比如自己写像素点和bm文件头,比如通过DC进行HBITMAP操作,获得一个标准位图数据再保存,比如用CImage保存等等,不同方式处理都有差别,需要的技巧也不相同。
追问
谢谢你的回答,实际上我是想根据y[i][j]数据画一个频谱图,横坐标是时间t,纵坐标是频率f,根据一个时间t和一个频率f可以对应出一个振幅A,A(f,t),其实是想用灰度图来进行三维数据的二维显示,问题是怎么把读入的数组数据写入bmp数据区同时显示在屏幕上。
追答
如果只是为了显示而不是保存,很简单,SetPixel画每一个点就可以了(当然这样画效率很低,可以使用双缓冲提高效率)。
另外比较高效的是SetBitmapBits,先创建一个CBitmap,然后设置宽高和像素点就可以了,这个只要是连续数据,宽高直接对应。
效率最高的是自己写bm数据,当然这个代码最麻烦。
如果你记录的只是曲线数据而不是连续的位图数据,那么可能第一种方法最简单了,注意使用双缓冲,效率应该可以接收。
逻辑示例代码如下:
HDC hDC; //缓冲hdc,要放在类成员变量中最好
HBITMAP m_hBitmapTmp;
//下面代码最好放到某个初始化函数,而不是OnPaint、OnDraw中
hDC = ::CreateCompatibleDC(GetDC().GetSafeHandle());
m_hBitmapTmp = (HBITMAP)SelectObject( hDC, CreateCompatibleBitmap( m_hDC, m_nWidth, m_nHeight ) );
ColorRGB sRGB[3];//用来存放单个点的像素值
for ( int ni = 0; ni<m; ni++ )
for ( int nj = 0; nj<n; nj++ )
{//这里SetPixel(hDC, x, y, nC1 )循环你的数组单点绘图}
//下面代码在OnPaint、OnDraw中
::BitBlt( hBufferDC, nX, nY, m_nWidth, m_nHeight, hDC, 0, 0, SRCCOPY );
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询