【问题标题】:Create ARGB DIB创建 ARGB DIB
【发布时间】:2013-10-16 09:31:02
【问题描述】:

如何创建 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。

【问题讨论】:

    标签: windows graphics gdi argb dib


    【解决方案1】:

    这是我从工作代码中拼凑出来的一个 sn-p。我看到的主要区别是设置掩码位和使用 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 );
    

    【讨论】:

      【解决方案2】:

      感谢您的回答。

      但是我的问题得到了解决。这实际上不是 DIB 创建的问题。 这是由于我用于 Blitting 的 API 错误。

      我使用 BitBlt 进行 blitting,但这个 API 不处理 Alpha 渐变。而不是我试过 TransparentBlt(参考:http://msdn.microsoft.com/en-us/library/windows/desktop/dd145141(v=vs.85).aspx

      这个 API 负责将 Alpha 值从源 DC 复制到目标 DC。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        相关资源
        最近更新 更多