2013-10-09 2 views
0

Как создать DIB с форматом ARGB. Я хочу разбить изображение (в нем какая-то прозрачная часть), используя этот DIB. Я попытался с помощью следующего кода, но он не работает должным образомСоздать ARGB DIB

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.

ответ

2

Вот фрагмент, который я собрал из частей рабочего кода. Основное различие, которое я вижу, - установить бит маски и использовать 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); 
1

Спасибо за ваш ответ.

Но моя проблема решена. На самом деле это не проблема с созданием DIB. Это было из-за неправильного API, который я использовал для Blitting.

Я использовал BitBlt для blitting, но этот API не заботится о градиенте Alpha. Вместо этого я попытался TransparentBlt (См: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145141(v=vs.85).aspx)

и работал этот API заботится о копировании значения альфа от источника постоянного тока до назначения постоянного тока.

Смежные вопросы