首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >array[byte]到HBITMAP或CBitmap

array[byte]到HBITMAP或CBitmap
EN

Stack Overflow用户
提问于 2011-02-14 14:47:32
回答 4查看 19.3K关注 0票数 10

我有一个字节数组(我直接从.bmp读取一个流,然后作为BLOB存储在数据库中),我希望在CImageList中显示为图标。因此,我想以某种方式将我的数据加载到HBITMAP或CBitmap中。到目前为止,我已经这样做了,从一个文件中读到:

代码语言:javascript
复制
hPic = (HBITMAP)LoadImage(NULL, strPath, IMAGE_BITMAP, dwWidth, dwHeight, LR_LOADFROMFILE | LR_VGACOLOR);
...
CBitmap bitmap;
bitmap.Attach(hPicRet);

但显然,这只适用于文件,而不适用于字节数组。我如何才能得到相同的结果,但读取一个字节数组呢?

编辑:注意到,我的数组不只是包含颜色信息,而是写在磁盘上的完整文件,包括所有头文件和元数据。在我看来,放弃所有这些信息是个坏主意。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-14 18:11:48

假设您将信息加载到一个名为字节的字节数组中.

代码语言:javascript
复制
BITMAPFILEHEADER* bmfh;
bmfh = (BITMAPFILEHEADER*)bytes;

BITMAPINFOHEADER* bmih;
bmih = (BITMAPINFOHEADER*)(bytes + sizeof(BITMAPFILEHEADER));
BITMAPINFO* bmi;
bmi = (BITMAPINFO*)bmih;

void* bits;
bits = (void*)(bytes + bmfh->bfOffBits);

HDC hdc = ::GetDC(NULL);

HBITMAP hbmp = CreateDIBitmap(hdc, bmih, CBM_INIT, bits, bmi, DIB_RGB_COLORS) ;

::ReleaseDC(NULL, hdc);

它有点混乱,可能需要大量的错误检查,但基本思想是正确的。

票数 20
EN

Stack Overflow用户

发布于 2011-02-14 15:00:21

下面的样本对你有帮助。

代码语言:javascript
复制
BITMAPINFO bmInfo;
BITMAPINFOHEADER &bmInfohdr = (BITMAPINFOHEADER)bmInfo.bmiHeader;

bmInfohdr.biSize = 40 + 255; //I think it's not of use
bmInfohdr.biWidth = x;
bmInfohdr.biHeight = y;
bmInfohdr.biPlanes=1;
bmInfohdr.biBitCount=8;
bmInfohdr.biCompression=0;
bmInfohdr.biSizeImage=0;
bmInfohdr.biXPelsPerMeter = 0;
bmInfohdr.biYPelsPerMeter = 0;
bmInfohdr.biClrUsed = 0;
bmInfohdr.biClrImportant = 0;

           // should I allocate memory further than the 
           // bmColors[1]?? anyway the compiler gives an
           // error for type mismatch!
//bmInfo.bmiColors = (RGBQUAD *) 
                  malloc(sizeof(RGBQUAD) * 256);

// here I define the 256 graylevel palette
for (int i=0; i<256; i++)
{
   bmInfo.bmiColors[i].rgbRed = i;
   bmInfo.bmiColors[i].rgbGreen = i;
   bmInfo.bmiColors[i].rgbBlue = i;
}


BYTE *matrix;
matrix = (BYTE*)malloc(size*sizeof(BYTE));
// here I put the BYTE values of the pixels

CDC *pdcDest = this->GetDC();

HBITMAP hBmp = CreateDIBitmap( pdcDest->m_hDC,
                &bmInfohdr,
                CBM_INIT,
                matrix,    
                &bmInfo,
                DIB_RGB_COLORS);
m_bmpBitmap.Attach( hBmp );
票数 2
EN

Stack Overflow用户

发布于 2011-02-14 15:05:20

像这样的东西对我来说很管用:

代码语言:javascript
复制
   int bitmap[WX*WY];  // truecolor bitmap data
   BITMAPINFO bm = { sizeof(BITMAPINFOHEADER), WX, WY, 1, 32, BI_RGB, 0, 0, 0, 0, 0 };
   HBITMAP bmp = CreateDIBSection( GetDC(win), &bm, DIB_RGB_COLORS, (void**)&bitmap, 0,0 );

(这是专门为32位颜色配置的,但您可以指定任何种类)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4993518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档