Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна инфа по GetDIBits 
:(
    Опции темы
VinSmile
Дата 4.12.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



Уже долгое время не могу найти подробной инфи по GetDIBits, тоесть не просто описания какие параметры ей передаються, а что за поля структур, какие значения за что отвечают и т.д. и т.п. Может у когото есть... Или кто знает где найти??? Очень надеюсь на вашу помощь!!!

P.S. Примеров есть много... Самых разных... Но мне нужно именно подробное описание всего что можно в эту функцию передать, и всего что от нее можно получить!!!

Это сообщение отредактировал(а) VinSmile - 4.12.2006, 02:24
PM MAIL   Вверх
dumb
Дата 4.12.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



PM MAIL   Вверх
Aleksandor
Дата 4.12.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Фень Юань - Графическое программирование аля windows


Код

BITMAPINFO * BitmapToDIB(HPALETTE hPal,    // palette for color conversion
                   HBITMAP  hBmp,                            // DDB for convert
                   int        nBitCount, int nCompression)    // format wanted
{
    typedef struct
    {
        BITMAPINFOHEADER bmiHeader;
        RGBQUAD             bmiColors[256+3];
    }    DIBINFO;

    BITMAP  ddbinfo;
    DIBINFO dibinfo;

    // retrieve DDB information
    if ( GetObject(hBmp, sizeof(BITMAP), & ddbinfo)==0 )
        return NULL;

    // fill out BITMAPINFOHEADER based on size and required format
    memset(&dibinfo, 0, sizeof(dibinfo));

    dibinfo.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
    dibinfo.bmiHeader.biWidth       = ddbinfo.bmWidth;
    dibinfo.bmiHeader.biHeight      = ddbinfo.bmHeight;
    dibinfo.bmiHeader.biPlanes      = 1;
    dibinfo.bmiHeader.biBitCount    = nBitCount;
    dibinfo.bmiHeader.biCompression = nCompression;

    HDC     hDC = GetDC(NULL); // screen DC
    HGDIOBJ hpalOld;
    
    if ( hPal )
        hpalOld = SelectPalette(hDC, hPal, FALSE);
    else
        hpalOld = NULL;

    // query GDI for image size
    GetDIBits(hDC, hBmp, 0, ddbinfo.bmHeight, NULL, (BITMAPINFO *) & dibinfo, DIB_RGB_COLORS);

    int nInfoSize  = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * GetDIBColorCount(dibinfo.bmiHeader);
    int nTotalSize = nInfoSize + GetDIBPixelSize(dibinfo.bmiHeader);

    BYTE * pDIB = new BYTE[nTotalSize];

    if ( pDIB )
    {
        memcpy(pDIB, & dibinfo, nInfoSize);
        
        if ( ddbinfo.bmHeight != GetDIBits(hDC, hBmp, 0, ddbinfo.bmHeight, pDIB + nInfoSize, (BITMAPINFO *) pDIB, DIB_RGB_COLORS) )
        {
            delete [] pDIB;
            pDIB = NULL;
        }
    }

    if ( hpalOld )
        SelectObject(hDC, hpalOld);

    ReleaseDC(NULL, hDC);

    return (BITMAPINFO *) pDIB;
}




Код

int PixelFormat(HDC hdc)
{
    typedef struct
    {
        BITMAPINFOHEADER bmiHeader;
        RGBQUAD             bmiColors[256+3];
    }    DIBINFO;

    DIBINFO dibinfo;

    HBITMAP hBmp = CreateCompatibleBitmap(hdc, 1, 1);
    
    if ( hBmp==NULL )
        return -1;

    memset(&dibinfo, 0, sizeof(dibinfo));

    dibinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

    // 1st call to get hdc biBitCount.
    GetDIBits(hdc, hBmp, 0, 1, NULL, (BITMAPINFO*) & dibinfo, DIB_RGB_COLORS);
       
    // 2nd calls to get color table or bitfields
    GetDIBits(hdc, hBmp, 0, 1, NULL, (BITMAPINFO*) & dibinfo, DIB_RGB_COLORS);
       
    DeleteObject(hBmp);

    // try to understand bit fields
    if ( dibinfo.bmiHeader.biBitCount==BI_BITFIELDS )
    {
        DWORD * pBitFields = (DWORD *) dibinfo.bmiColors;
        DWORD red   = pBitFields[0];
        DWORD green = pBitFields[1];
        DWORD blue  = pBitFields[2];

        if (      (blue==0x001F) && (green==0x03E0) && (red==0x7C00) )
            return DIB_16RGB555;
        else if ( (blue==0x001F) && (green==0x007E) && (red==0xF800) )
            return DIB_16RGB565;
        else if ( (blue==0x00FF) && (green==0xFF00) && (red==0xFF0000) )
            return DIB_32RGB888;
        else
            return -1;
    }

    switch ( dibinfo.bmiHeader.biBitCount )
    {
        case 1:    return DIB_1BPP;
        case 2: return DIB_2BPP;
        case 4:    return DIB_4BPP;
        case 8: return DIB_8BPP;
       case 24: return DIB_24RGB888;
       case 16: return DIB_16RGB555;
       case 32: return DIB_32RGB888;

       default: return -1;
    }
}




--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.