导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

怎么将内存中的BMP图像数据以图片的形式显示在Picture控件里

lsxsxs 2010-07-27 01:55:11
我已经得到了一个BMP图片的数据,文件头也有。
BITMAPFILEHEADER m_BMPHeader1;
BITMAPINFOHEADER m_BMPInfoHeader1;
都已经给m_BMPHeader1和m_BMPInfoHeader1赋好值了。
unsigned char buf2[921600];//里面存放的是图形的RGB数据,是640*480的
我也弄了个unsigned char buf3[921654],来把m_BMPHeader1,m_BMPInfoHeader1和buf2给存进去了。
现在我该怎么把这个数据显示到Picture控件里呢,控件大小我也是固定的640*480的,所以不需要改变大小,直接显示上去就可以。
我在网上看了SetDIBits,但是我不知道怎么把各个参数赋进去。
SetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits,CONST BITMAPINFO *lpbmi, UINT fuColorUse);
其中第二个参数HBITMAP hbmp我该赋什么,还有CONST VOID *lpvBits 我该赋什么呢。CONST BITMAPINFO *lpbmi我该赋什么进去,是我上面定义的哪个参数。
希望哪位大哥说详细点啊,不胜感激。先谢过了。
...全文
195 1 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ptoly 2010-10-16
这个ShowDib (hdc, (BITMAPFILEHEADER * )buf3, 640, 480, SHOW_NORMAL);中的hdc怎么在内存中获取啊?
回复
lsxsxs 2010-09-05
谢谢了
回复
hastings 2010-07-27
#define SHOW_NORMAL			1
#define SHOW_CENTER 2
#define SHOW_STRETCH 3
#define SHOW_ISOSTRETCH 4
int ShowDib (HDC hdc, BITMAPFILEHEADER * pbmfh, int cxClient, int cyClient, int wShow)
{
if(NULL==pbmfh)
return 0;
return ShowDib(hdc,(BITMAPINFO*)(pbmfh+1),(BYTE*)pbmfh+(pbmfh->bfOffBits),cxClient,cyClient,wShow);
}
int ShowDib (HDC hdc, BITMAPINFO * pbmi, BYTE * pBits, int cxClient, int cyClient, int wShow)
{
if(NULL==hdc || NULL==pbmi || NULL==pBits || wShow<SHOW_NORMAL || wShow>SHOW_ISOSTRETCH)
return 0;
int cxDib, cyDib ;
int BltMode, ret ;
if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
{
cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
}
else
{
cxDib = pbmi->bmiHeader.biWidth ;
cyDib = abs (pbmi->bmiHeader.biHeight) ;
}
switch (wShow)
{
case SHOW_NORMAL:
return SetDIBitsToDevice (hdc, 0, 0, cxDib, cyDib, 0, 0,
0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;

case SHOW_CENTER:
return SetDIBitsToDevice (hdc, (cxClient - cxDib) / 2,(cyClient - cyDib) / 2,
cxDib, cyDib, 0, 0, 0, cyDib, pBits, pbmi, DIB_RGB_COLORS) ;

case SHOW_STRETCH:
BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
ret=StretchDIBits (hdc, 0, 0, cxClient, cyClient,
0, 0, cxDib, cyDib,
pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
SetStretchBltMode (hdc, BltMode) ;
return ret;

case SHOW_ISOSTRETCH:
BltMode=SetStretchBltMode (hdc, COLORONCOLOR) ;
if(cxDib*cyClient > cyDib*cxClient)//图更宽
ret=StretchDIBits (hdc,0,
(cyClient-(int)((float)cyDib/(float)cxDib*(float)cxClient))/2,
cxClient, (int)((float)cyDib/(float)cxDib*(float)cxClient) ,
0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
else
ret=StretchDIBits (hdc,
(cxClient-(int)((float)cxDib/(float)cyDib*(float)cyClient))/2, 0,
(int)((float)cxDib/(float)cyDib*(float)cyClient), cyClient,
0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
SetStretchBltMode (hdc, BltMode) ;
return ret;
}
return 0 ;
}
ShowDib (hdc, (BITMAPFILEHEADER * )buf3, 640, 480, SHOW_NORMAL);
回复
aamaomao 2010-07-27
这个函数就ok了
int StretchDIBits(
HDC hdc, // handle to DC
int XDest, // x-coord of destination upper-left corner
int YDest, // y-coord of destination upper-left corner
int nDestWidth, // width of destination rectangle
int nDestHeight, // height of destination rectangle
int XSrc, // x-coord of source upper-left corner
int YSrc, // y-coord of source upper-left corner
int nSrcWidth, // width of source rectangle
int nSrcHeight, // height of source rectangle
CONST VOID *lpBits, // bitmap bits
CONST BITMAPINFO *lpBitsInfo, // bitmap data
UINT iUsage, // usage options
DWORD dwRop // raster operation code
);
回复
踏实每一步 2010-07-27
BITMAPINFOHEADER bhead;
BITMAPINFO bi;
bi.bmiHeader = bhead;
bi.bmiColors[1].rgbBlue = 100;
bi.bmiColors[1].rgbGreen = 100;
bi.bmiColors[1].rgbRed = 100;
bi.bmiColors[1].rgbReserved = 0;
回复
xingpacer 2010-07-27
帮忙顶一个~学习了
回复
iamshuke 2010-07-27
SetDIBits用法:
http://blog.csdn.net/iamshuke/archive/2010/07/20/5749933.aspx
回复
lsxsxs 2010-07-27
打开文件显示出来我会弄,这个数据是传回来的数据,不是从某个图片上读取出来的数据。最主要的是那个BITMAPINFO我该怎么弄,24位的又没有调色板,我把BITMAPINFOHEADER赋进去,就报错说不能从BITMAPINFOHEADER*转化为BITMAPINFO*
回复
雪影 2010-07-27
HBITMAP CShowBMPDlg::BufferToHBITMAP()
...{
HBITMAP hShowBMP;
LPSTR hDIB,lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;

bmfHeaderLen = sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);

if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;
hDIB = lpBuffer + bmfHeaderLen;
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
m_bmW = bmiHeader.biWidth;
m_bmH = bmiHeader.biHeight;
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;
CClientDC dc(this);
hShowBMP = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
return hShowBMP;
}

void CShowBMPDlg::DrawImage(int x, int y, CDC *pDC)
...{
HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
OldBitmap=(HBITMAP)MemDC.SelectObject(m_hBitmap);

CBitmap* pBitmap = CBitmap::FromHandle(m_hBitmap);
if(m_bmW == 0 || m_bmH == 0)
return ;
CRect rect;
GetClientRect(&rect);
/**//*str.Format("%d %d", rect.Width(),rect.Height());
MessageBox(str);*/
pDC->BitBlt(x,y,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);

GetRGB(MemDC);

MemDC.SelectObject(OldBitmap);
}
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……