从内存中绘制位图

时间:2013-04-19 11:20:04

标签: c++ c winapi bitmap bmp

我需要创建HBITMAP。

这就是问题所在。我在内存中有bmp文件的内容。

如果位图是资源,我知道如何创建HBITMAP。 但由于它存在于记忆中,我不知道该怎么做。

我这样做(如果在资源中):Link

    hDC = BeginPaint(hWnd, &Ps);

    // Load the bitmap from the resource
    bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
    // Create a memory device compatible with the above DC variable
    MemDCExercising = CreateCompatibleDC(hDC);
         // Select the new bitmap
         SelectObject(MemDCExercising, bmpExercising);

    // Copy the bits from the memory DC into the current dc
    BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);

    // Restore the old bitmap
    DeleteDC(MemDCExercising);
    DeleteObject(bmpExercising);
    EndPaint(hWnd, &Ps);

如果是内存资源,请指导我如何操作。 以某种方式将char img[10000]更改为资源? 这里,img是与位图内容相对应的内存。

1 个答案:

答案 0 :(得分:1)

首先,让我们删除一点无辜的问题:

hDC = BeginPaint(hWnd, &Ps);

// Load the bitmap from the resource
bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
// Create a memory device compatible with the above DC variable
MemDCExercising = CreateCompatibleDC(hDC);
     // Select the new bitmap
HOBJECT oldbmp = SelectObject(MemDCExercising, bmpExercising); //<<<<save it for later ...

// Copy the bits from the memory DC into the current dc
BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);

// Restore the old bitmap
SelectObject(MemDCExercising, oldbmp); //<<<... DeleteDC will leak memory if it holds a resource
DeleteDC(MemDCExercising);
DeleteObject(bmpExercising);
EndPaint(hWnd, &Ps);

现在,HBITMAP(概念上讲)是一个指向内部结构的指针,该内部结构包含一个“指针”(实际上更像是一个流),它指向你无法访问的GDI内存空间。

“内存位图”未作为内存缓冲区显示在您的程序中,而是作为一个与CreateCompatibleBitmap获得的HBITMAP,其中HDC参数标识位图所具有的DC兼容。 (通常是屏幕,窗口或绘画DC)。

您可以通过包含初始数据的缓冲区来初始化初始化位图,或者使用CreateBitmapGetBitmapBits获取位图保存的数据。

在任何情况下,这些都是位图数据的本地副本,而不是GDI引入的“实时位图”。

另请注意,这些数据的内部结构取决于位图需要具有的格式(每个像素在多少平面上有多少位,有或没有调色板),以及在Blit过程中避免性能损失,它必须与屏幕设置使用的格式一致。

这不一定必须与位图保存到“bmp”文件时的位置相同。