【问题标题】:Gdiplus Bitmap has no Alpha ChannelGdiplus Bitmap 没有 Alpha 通道
【发布时间】:2019-01-03 11:03:55
【问题描述】:

我正在尝试通过 BITMAPINFO(缩短的代码示例)创建 Gdiplus::Bitmap:

    BITMAPINFO bmi;
    HDC hdc;
    void* pvBits;

    ZeroMemory(&bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = some_width;
    bmi.bmiHeader.biHeight = some_height;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 24;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biSizeImage = ((((bmi.bmiHeader.biWidth * bmi.bmiHeader.biBitCount) + 31) & ~31) >> 3) * bmi.bmiHeader.biHeight;

    HBITMAP hBM = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0);
    FillMemory(pvBits, bmi.bmiHeader.biSizeImage, 255);

    HGDIOBJ oldObj = SelectObject(hDC, hBM);
    ReleaseDC(NULL, hDC);

    GdiFlush();

    GdiPlusBitmap* bitmap = new Gdiplus::Bitmap(&bmi, pvBits);

我的问题是创建的位图没有 alpha 通道 (PixelFormat24bppRGB)。我错过了什么?

【问题讨论】:

  • 没有,最近的可用是BI_PNG
  • 您设置了 24 bpp 而不是 32 bpp。 hdc 也在这里未初始化未使用(实际上它根本不应该出现在这里)。

标签: c++ bitmap gdi+


【解决方案1】:
bmi.bmiHeader.biBitCount = 32;
hDC = CreateCompatibleDC(someOtherDc);

你可以看一个例子here

【讨论】:

  • 附注:前几天我正在使用 32 位位图,并注意到一些较旧的文档没有提到每像素 32 位作为可接受的值。不过,它似乎确实适用于现代机器。
猜你喜欢
  • 2018-11-20
  • 2010-09-25
  • 2010-12-28
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2011-06-12
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多