如何将指向图像数据首地址的图像数据指针和位图对应起来 pData为图像数据指针,指向内存中图像数据的首地址,可以从这个地址开始读取图像数据的灰度值,然后可以再用位图的方式做显示。思路是有,但是现在如何将这个指针和位图相关部分对应起来还不是很明白。有种说法是建立一个位图,把头全部填充好,然后数据区用pData填充,这似乎是可以的。但如何执行?有什么更具体的方法么?求问呐 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是否定义了位图头后,在用StretchDIBits函数绘制图像时lpBits设置为数据地址的pData指针,lpBitsInfo指向BITMAPINFO结构的指针就行? 有个叫 CreateDIBSection 的API哦。会直接返回一个ppvBits,再把你的数据memcpy给它就行了。 那是先定义位图结构(包括BITMAPINFO、BITMAPFILEHEADER、BITMAPINFOHEADER等),根据这些内容用CreateDIBSection创建位图,再用memcpy将图像数据指针pData指向的数据拷贝到ppvBits指针指向的数据,再用StretchDIBits显示位图就好?大致过程是这样的么?对于位图一块不是很了解,还望解答 通过调用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等都可以 非常感谢回答,现在的问题是图像控件能够起作用,但是没有顺利显示图像,只能看到图像控件全被黑色填充了。是哪里的值设置错误导致读取出现差错么? // Copy of the image structure grabbed from the SDK. FlyCaptureImage m_imageRaw;//m_imageRaw.pData表示数据指针,m_imageRaw.iCols、m_imageRaw.iRows分别表示图像的列和行 // Structure used to draw to the screen. BITMAPINFO m_bitmapInfo; CDC* pDC = GetDlgItem( IDC_ShowImage ) ->GetDC(); // 获取 HDC(设备句柄) 来进行绘图操作,获取图像控件的句柄 HDC hDC = pDC ->GetSafeHdc(); CRect rect; GetDlgItem(IDC_ShowImage) ->GetClientRect( &rect ); // 求出图片控件的宽和高 int rw = rect.right - rect.left; int rh = rect.bottom - rect.top; ZeroMemory(&m_bitmapInfo.bmiHeader, sizeof(BITMAPINFOHEADER)); m_bitmapInfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); m_bitmapInfo.bmiHeader.biWidth = m_imageRaw.iCols; m_bitmapInfo.bmiHeader.biHeight = -m_imageRaw.iRows; m_bitmapInfo.bmiHeader.biPlanes = 1; m_bitmapInfo.bmiHeader.biBitCount = 1; m_bitmapInfo.bmiHeader.biCompression = BI_RGB; m_bitmapInfo.bmiHeader.biXPelsPerMeter = 0; m_bitmapInfo.bmiHeader.biYPelsPerMeter = 0; m_bitmapInfo.bmiHeader.biClrImportant = 0; m_bitmapInfo.bmiHeader.biClrUsed = 0; m_bitmapInfo.bmiHeader.biSizeImage= 0;//m_bitmapInfo.bmiHeader.biWidth * //m_bitmapInfo.bmiHeader.biHeight * ( m_bitmapInfo.bmiHeader.biBitCount / 8 ); BYTE * lpBits=NULL ; HBITMAP hBitmap=::CreateDIBSection(NULL,(BITMAPINFO *)&m_bitmapInfo.bmiHeader, DIB_RGB_COLORS,(void**)&lpBits,NULL,0) ; memcpy(lpBits,m_imageRaw.pData,sizeof(m_imageRaw.iCols*m_imageRaw.iRows)); StretchDIBits(hDC, 0, 0, rw, rh, 0, 0, m_imageRaw.iCols, m_imageRaw.iRows, lpBits, &m_bitmapInfo, DIB_RGB_COLORS, SRCCOPY); 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)); *((char *)&bmfh.bfType) = 'B'; *(((char *)&bmfh.bfType) + 1) = 'M'; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8; TCHAR szBMPFileName[128]; int iBMPBytes = iWidth * iHeight * iPixel / 8; CString save_path; save_path = hFileDlg.GetPathName(); strcpy(szBMPFileName,save_path); CFile file; if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate)) { BeginWaitCursor(); file.Write(&bmfh,sizeof(BITMAPFILEHEADER)); file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER)); file.Write(pBits,iBMPBytes); file.Close(); EndWaitCursor(); } pMemDC->DeleteDC(); delete pMemDC; pMemDC = NULL; delete pBitMap; pBitMap = NULL; delete lpbmih; lpbmih = NULL; AfxMessageBox("保存成功!!!"); pBits就是要被拷贝的指针对象 那是你stretchblt参数填的不好 compatibledc是不是和“显存”有关系? 调用PeekMessage(&msg, NULL,0,0,PM_REMOVE))后,是不是一定要接TranslateMessage(&msg)和DispatchMessage(&msg)???? Combo Box为什么没有下拉框了??? 帮公司找人,深圳一家公司需要招一个wince下evc开发的人,只要有12以上VC开发经验即可 简单问题高分相送 XML的名字空间问题 步进电机与伺服电机有什么区别? Vc的问题 请问一个界面方面的技术问题 串口收发中文用什么类型 请教几个问题 如何实现ctreectrl树节点复选框多选的情况?
会直接返回一个ppvBits,再把你的数据memcpy给它就行了。
::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等都可以
// Copy of the image structure grabbed from the SDK.
FlyCaptureImage m_imageRaw;//m_imageRaw.pData表示数据指针,m_imageRaw.iCols、m_imageRaw.iRows分别表示图像的列和行 // Structure used to draw to the screen.
BITMAPINFO m_bitmapInfo; CDC* pDC = GetDlgItem( IDC_ShowImage ) ->GetDC();
// 获取 HDC(设备句柄) 来进行绘图操作,获取图像控件的句柄
HDC hDC = pDC ->GetSafeHdc();
CRect rect;
GetDlgItem(IDC_ShowImage) ->GetClientRect( &rect );
// 求出图片控件的宽和高
int rw = rect.right - rect.left;
int rh = rect.bottom - rect.top; ZeroMemory(&m_bitmapInfo.bmiHeader, sizeof(BITMAPINFOHEADER));
m_bitmapInfo.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
m_bitmapInfo.bmiHeader.biWidth = m_imageRaw.iCols;
m_bitmapInfo.bmiHeader.biHeight = -m_imageRaw.iRows;
m_bitmapInfo.bmiHeader.biPlanes = 1;
m_bitmapInfo.bmiHeader.biBitCount = 1;
m_bitmapInfo.bmiHeader.biCompression = BI_RGB;
m_bitmapInfo.bmiHeader.biXPelsPerMeter = 0;
m_bitmapInfo.bmiHeader.biYPelsPerMeter = 0;
m_bitmapInfo.bmiHeader.biClrImportant = 0;
m_bitmapInfo.bmiHeader.biClrUsed = 0;
m_bitmapInfo.bmiHeader.biSizeImage= 0;//m_bitmapInfo.bmiHeader.biWidth *
//m_bitmapInfo.bmiHeader.biHeight * ( m_bitmapInfo.bmiHeader.biBitCount / 8 ); BYTE * lpBits=NULL ;
HBITMAP hBitmap=::CreateDIBSection(NULL,(BITMAPINFO *)&m_bitmapInfo.bmiHeader,
DIB_RGB_COLORS,(void**)&lpBits,NULL,0) ;
memcpy(lpBits,m_imageRaw.pData,sizeof(m_imageRaw.iCols*m_imageRaw.iRows));
StretchDIBits(hDC,
0,
0,
rw,
rh,
0,
0,
m_imageRaw.iCols,
m_imageRaw.iRows,
lpBits,
&m_bitmapInfo,
DIB_RGB_COLORS,
SRCCOPY);
这里面不止宽*高, 一个像素可是 4 个字节哟(如果是32位图片的话)
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));
*((char *)&bmfh.bfType) = 'B';
*(((char *)&bmfh.bfType) + 1) = 'M';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8; CString save_path;
save_path = hFileDlg.GetPathName();
strcpy(szBMPFileName,save_path);
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
BeginWaitCursor();
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
EndWaitCursor();
}
pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL; AfxMessageBox("保存成功!!!");
pBits就是要被拷贝的指针对象
那是你stretchblt参数填的不好