怎么将指向图像数据首地址的图像数据指针和位图对应起来
如何将指向图像数据首地址的图像数据指针和位图对应起来
pData为图像数据指针,指向内存中图像数据的首地址,可以从这个地址开始读取图像数据的灰度值,然后可以再用位图的方式做显示。
思路是有,但是现在如何将这个指针和位图相关部分对应起来还不是很明白。
有种说法是建立一个位图,把头全部填充好,然后数据区用pData填充,这似乎是可以的。但如何执行?有什么更具体的方法么?
求问呐
------解决方案--------------------
有个叫 CreateDIBSection 的API哦。
会直接返回一个ppvBits,再把你的数据memcpy给它就行了。
------解决方案--------------------
通过调用GetBits类似的方法得到位图数据指针,然后将先前得到的图像数据进行memcpy就ok了
------解决方案--------------------
BITMAPINFOHEADER bmih;
::ZeroMemory(&bmih, sizeof(BITMAPINFOHEADER));
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biBitCount = 32;
bmih.biWidth = nDestWidth;
bmih.biHeight = nDestHeight * -1;
bmih.biCompression = BI_RGB;
bmih.biPlanes = 1;
BYTE* lpBits = NULL;
HBITMAP hBitmap = ::CreateDIBSection(NULL,(BITMAPINFO*)&bmih, DIB_RGB_COLORS, (void**)&lpBits, NULL, 0 );
if (NULL == hBitmap
------解决方案--------------------
NULL == lpBits)
return false;
然后将图像数据拷贝给 lpBits.(拷贝数据时,注意你的数据格式与创建的图片格式有可能不同)
这样这个hBitmap就能被选入HDC,再调用BitBlt或者 StretchBlt等都可以
------解决方案--------------------
memcpy(lpBits,m_imageRaw.pData,sizeof(m_imageRaw.iCols*m_imageRaw.iRows));
这里面不止宽*高, 一个像素可是 4 个字节哟(如果是32位图片的话)
------解决方案--------------------
上一段我的保存BMP代码,希望对楼主有帮助
pData为图像数据指针,指向内存中图像数据的首地址,可以从这个地址开始读取图像数据的灰度值,然后可以再用位图的方式做显示。
思路是有,但是现在如何将这个指针和位图相关部分对应起来还不是很明白。
有种说法是建立一个位图,把头全部填充好,然后数据区用pData填充,这似乎是可以的。但如何执行?有什么更具体的方法么?
求问呐
------解决方案--------------------
有个叫 CreateDIBSection 的API哦。
会直接返回一个ppvBits,再把你的数据memcpy给它就行了。
------解决方案--------------------
通过调用GetBits类似的方法得到位图数据指针,然后将先前得到的图像数据进行memcpy就ok了
------解决方案--------------------
BITMAPINFOHEADER bmih;
::ZeroMemory(&bmih, sizeof(BITMAPINFOHEADER));
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biBitCount = 32;
bmih.biWidth = nDestWidth;
bmih.biHeight = nDestHeight * -1;
bmih.biCompression = BI_RGB;
bmih.biPlanes = 1;
BYTE* lpBits = NULL;
HBITMAP hBitmap = ::CreateDIBSection(NULL,(BITMAPINFO*)&bmih, DIB_RGB_COLORS, (void**)&lpBits, NULL, 0 );
if (NULL == hBitmap
------解决方案--------------------
NULL == lpBits)
return false;
然后将图像数据拷贝给 lpBits.(拷贝数据时,注意你的数据格式与创建的图片格式有可能不同)
这样这个hBitmap就能被选入HDC,再调用BitBlt或者 StretchBlt等都可以
------解决方案--------------------
memcpy(lpBits,m_imageRaw.pData,sizeof(m_imageRaw.iCols*m_imageRaw.iRows));
这里面不止宽*高, 一个像素可是 4 个字节哟(如果是32位图片的话)
------解决方案--------------------
上一段我的保存BMP代码,希望对楼主有帮助
int temBgBitmapX = NewBgBitmapX / 10 * 10;
int temBgBitmapY = NewBgBitmapY / 10 * 10;
//定义图形大小
int iWidth = temBgBitmapX;
int iHeight = temBgBitmapY;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;
//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC *pMemDC = NULL;
BYTE *pBits;
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);
pMemDC = new CDC;
pMemDC->Attach(hdcMem);
pMemDC->SelectObject(pBitMap);
CRect rc(0,0,iWidth,iHeight);
pMemDC->SetBkMode(TRANSPARENT);
//画出所要图像
DrawGIS(pMemDC,rc);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));