Windows 创建ARGB-DIB

Windows 创建ARGB-DIB,windows,graphics,gdi,argb,dib,Windows,Graphics,Gdi,Argb,Dib,如何使用ARGB格式创建DIB。我想使用这个DIB blit一个图像(其中有一些部分是透明的)。 我尝试了以下代码,但它不能正常工作 unsigned char * rawdata; ==> Filled by Qimage Raw Data unsigned char * buffer = NULL; memset(&bmi, 0, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOH

如何使用ARGB格式创建DIB。我想使用这个DIB blit一个图像(其中有一些部分是透明的)。 我尝试了以下代码,但它不能正常工作

   unsigned char * rawdata;   ==> Filled by Qimage Raw Data
    unsigned char * buffer = NULL;  
    memset(&bmi, 0, sizeof(bmi));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;/* Width of your image buffer */
    bmi.bmiHeader.biHeight = -height; /* Height of your image buffer */
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;
   HBITMAP  g_dibbmp = CreateDIBSection(hDesktopDC, &bmi, DIB_RGB_COLORS, (void **)&buffer, 0, 0);
    if (!buffer) 
    { /* ERROR */
        printf("ERROR DIB could not create buffer\n");
    }
    else
    {
        printf("DIB created buffer successfully\n");
        memcpy(buffer,rawdata,sizeof(rawdata));
    }
请帮忙

里根人


Techtotie.

这里是我从工作代码片段中拼凑出来的一个片段。我看到的主要区别是设置掩码位和使用memsection

// assumes height and width passed in
int bpp = 32; // Bits per pixel
int stride = (width * (bpp / 8));
unsigned int byteCount = (unsigned int)(stride * height);

HANDLE hMemSection = ::CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, byteCount, NULL );
if (hMemSection == NULL)
   return false;

BITMAPV5HEADER bmh;
memset( &bmh, 0, sizeof( BITMAPV5HEADER ) );
bmh.bV5Size = sizeof( BITMAPV5HEADER );
bmh.bV5Width = width;
bmh.bV5Height = -height;
bmh.bV5Planes = 1;
bmh.bV5BitCount = 32;
bmh.bV5Compression = BI_RGB;
bmh.bV5AlphaMask = 0xFF000000;
bmh.bV5RedMask   = 0x00FF0000;
bmh.bV5GreenMask = 0x0000FF00;
bmh.bV5BlueMask  = 0x000000FF;

HDC hdc = ::GetDC( NULL );
HBITMAP hDIB = ::CreateDIBSection( hdc, (BITMAPINFO *) &bmh, DIB_RGB_COLORS, 
    &pBits, hMemSection, (DWORD) 0 );
::ReleaseDC( NULL, hdc );

// Much later when done manipulating the bitmap
::CloseHandle( hMemSection );

下面是我从一段工作代码中拼凑出来的一个片段。我看到的主要区别是设置掩码位和使用memsection

// assumes height and width passed in
int bpp = 32; // Bits per pixel
int stride = (width * (bpp / 8));
unsigned int byteCount = (unsigned int)(stride * height);

HANDLE hMemSection = ::CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, byteCount, NULL );
if (hMemSection == NULL)
   return false;

BITMAPV5HEADER bmh;
memset( &bmh, 0, sizeof( BITMAPV5HEADER ) );
bmh.bV5Size = sizeof( BITMAPV5HEADER );
bmh.bV5Width = width;
bmh.bV5Height = -height;
bmh.bV5Planes = 1;
bmh.bV5BitCount = 32;
bmh.bV5Compression = BI_RGB;
bmh.bV5AlphaMask = 0xFF000000;
bmh.bV5RedMask   = 0x00FF0000;
bmh.bV5GreenMask = 0x0000FF00;
bmh.bV5BlueMask  = 0x000000FF;

HDC hdc = ::GetDC( NULL );
HBITMAP hDIB = ::CreateDIBSection( hdc, (BITMAPINFO *) &bmh, DIB_RGB_COLORS, 
    &pBits, hMemSection, (DWORD) 0 );
::ReleaseDC( NULL, hdc );

// Much later when done manipulating the bitmap
::CloseHandle( hMemSection );

谢谢你的回答

但是我的问题解决了。这实际上不是DIB创建的问题。 这是因为我使用了错误的API进行Blitting

我使用BitBlt进行blitting,但是这个API没有考虑Alpha梯度。我没有这样做,而是尝试了 透明性lt(请参阅:)


这个API负责将Alpha值从源DC复制到目标DC。谢谢您的回答

但是我的问题解决了。这实际上不是DIB创建的问题。 这是因为我使用了错误的API进行Blitting

我使用BitBlt进行blitting,但是这个API没有考虑Alpha梯度。我没有这样做,而是尝试了 透明性lt(请参阅:)

它的工作原理是,这个API负责将Alpha值从源DC复制到目标DC