Не работает SetDIBits
От: Vladimir Россия  
Дата: 20.01.24 12:48
Оценка:
Как-то не удобно обращаться с таким вопросом, но все-таки:
Необходимо заполнить битмап зеленым цветом.
HBITMAP SetColor(HDC hdc)
{
    HBITMAP bitmap = CreateCompatibleBitmap(hdc,32,32);
    BITMAPINFO bi{ 0 };
    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    if (!GetDIBits(hdc, bitmap, 0, 0, NULL, &bi, DIB_RGB_COLORS))
        return NULL;
    // bi честно заполняется значениями !!!
    BYTE *bits = new BYTE[bi.bmiHeader.biSizeImage];
    DWORD color = RGB(0,255,0);
    for (int i = 0; i < bi.bmiHeader.biWidth * bi.bmiHeader.biHeight; i++) {
        memcpy(&bits[i*4], &color, 4);
    }
    // Вот здесь возникает ошибка ERROR_MOD_NOT_FOUND
    int result = SetDIBits(hdc, bitmap, 0, bi.bmiHeader.biHeight,
        (LPVOID)bits, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
    delete [] bits;
    return bitmap;
}

Где-то прочитал использовать SelectObject(hdc, bitmap), безрезульнатно.
Такие простые неполадки порой просто выбешивают!!!
Спасибо.
Re: Не работает SetDIBits
От: kov_serg Россия  
Дата: 20.01.24 13:30
Оценка:
Здравствуйте, Vladimir, Вы писали:

V>Как-то не удобно обращаться с таким вопросом, но все-таки:

V>Необходимо заполнить битмап зеленым цветом.

А если так:
HBITMAP SetColor(HDC hdc)
{
    HBITMAP bitmap = CreateCompatibleBitmap(hdc,32,32);
    BITMAPINFO bi[1]={};
    bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    if (!GetDIBits(hdc, bitmap, 0, 0, NULL, bi, DIB_RGB_COLORS))
        return NULL;
    bi->bmiHeader.biBitCount = 32;
    bi->bmiHeader.biCompression = BI_RGB;
    bi->bmiHeader.biHeight = abs(bi->bmiHeader.biHeight);
    if (!GetDIBits(hdc, bitmap, 0, 0, NULL, bi, DIB_RGB_COLORS))
        return NULL;
    BYTE *bits = new BYTE[bi->bmiHeader.biSizeImage];
    DWORD color = RGB(0,255,0);
    for (int i = 0; i < bi->bmiHeader.biWidth * bi->bmiHeader.biHeight; i++) {
        memcpy(&bits[i*4], &color, 4);
    }
    int result = SetDIBits(hdc, bitmap, 0, bi.bmiHeader.biHeight,
        (LPVOID)bits, bi, DIB_RGB_COLORS);
    delete [] bits;
    return bitmap;
}
Re: Не работает SetDIBits
От: reversecode google
Дата: 20.01.24 13:36
Оценка:
вроде как bi надо заполнять
даже если используется GetDIBits
трекните все ли нужные поля выставляются самой функцией после того как ее вызвали
т.е. она возвращает
должны быть корректные
bi.biWidth
bi.biHeight
bi.biPlanes
bi.biBitCount
bi.biCompression


дальше перед отдачей в SetDIBits
надо все таки ставить
bi.bmiHeader.biCompression = BI_RGB;

https://www.codeproject.com/Articles/14052/Image-Processing-Using-GDI
Re[2]: Не работает SetDIBits
От: Vladimir Россия  
Дата: 20.01.24 14:52
Оценка:
Здравствуйте, kov_serg, Вы писали:

Большое спасибо Вам.
bi.bmiHeader.biCompression = BI_RGB;
Это что я бы изменил в последнюю очередь, и то от безысходности.
Меня смутило что при biBitCount = 24, BI_BITFIELDS прекрасно работает, и к тому же GetDIBits возвращает BI_BITFIELDS !!!
Re[3]: Не работает SetDIBits
От: ononim  
Дата: 20.01.24 15:21
Оценка:
V>bi.bmiHeader.biCompression = BI_RGB;
V>Это что я бы изменил в последнюю очередь, и то от безысходности.
между прочим BI_RGB = 0x0000 а учитывая BITMAPINFO bi{ 0 } — это не должно изменить ровным счетом ничего
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.