Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateCompatibleDC grayscale 
:(
    Опции темы
nikkadim
Дата 7.8.2012, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день,

Подскажите плз, что делаю не так - хочу выводить на экран grayscale изображение, но как только раскоментирую цикл LUT  сразу получаю вылет приложения.
Как-будто обращаюсь в невыделенную память?!


Код


    unsigned char* ptr;
    ptr = (unsigned char*)malloc( 300 * 300);
    BITMAPINFO bmi;
    ZeroMemory(&bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biBitCount = 8;
    bmi.bmiHeader.biClrUsed = 0;
    bmi.bmiHeader.biHeight = 300;
    bmi.bmiHeader.biWidth = 300;
    bmi.bmiHeader.biSizeImage = 300*300;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biCompression = BI_RGB;
    //ZeroMemory(bmi.bmiColors, sizeof(RGBQUAD));
    /*
    for(int i=0; i<256; i++)
    {
        bmi.bmiColors[i].rgbRed = i;
        bmi.bmiColors[i].rgbGreen = i;
        bmi.bmiColors[i].rgbBlue = i;
        bmi.bmiColors[i].rgbReserved = 0;
    }    
    */
    HDC dc = CreateCompatibleDC((HDC)mPictureBox.GetDC());
    HBITMAP hbitmap = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (void**)&ptr,  NULL, 0);
    
    for (int i=0; i<300*300; i++)
        ptr[i] = rand()%255;
    
    SetDIBits(dc, hbitmap, 0, 300, ptr, &bmi, DIB_RGB_COLORS );
    
    mPictureBox.SetBitmap(hbitmap);
    //mPictureBox.RedrawWindow();
//free(ptr)


Добавлено через 7 минут и 10 секунд
не понял почему, но обошел вот так:
Код

    unsigned char* ptr;
    ptr = (unsigned char*)malloc( 300 * 300);



    BITMAPINFO bmi;
    LPBITMAPINFO info; 
    info = (LPBITMAPINFO) malloc(sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD));
    //ZeroMemory(&bmi, sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD));
    info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    info->bmiHeader.biBitCount = 8;
    info->bmiHeader.biClrUsed = 0;
    info->bmiHeader.biHeight = 300;
    info->bmiHeader.biWidth = 300;
    info->bmiHeader.biSizeImage = 300*300;
    info->bmiHeader.biPlanes = 1;
    info->bmiHeader.biCompression = BI_RGB;
    //ZeroMemory(bmi.bmiColors, sizeof(RGBQUAD));
    
    for(int i=0; i<256; i++)
    {
        info->bmiColors[i].rgbRed = i;
        info->bmiColors[i].rgbGreen = i;
        info->bmiColors[i].rgbBlue = i;
        info->bmiColors[i].rgbReserved = 0;
    }    
    
    HDC dc = CreateCompatibleDC((HDC)mPictureBox.GetDC());
    HBITMAP hbitmap = CreateDIBSection(dc, info, DIB_RGB_COLORS, (void**)&ptr,  NULL, 0);
    
    for (int i=0; i<300*300; i++)
        ptr[i] = rand()%255;
    
    SetDIBits(dc, hbitmap, 0, 300, ptr, info, DIB_RGB_COLORS );
    
    mPictureBox.SetBitmap(hbitmap);
    //mPictureBox.RedrawWindow();

    //free (ptr);

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


Опытный
**


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

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



Цитата(nikkadim @  7.8.2012,  15:26 Найти цитируемый пост)
не понял почему, но обошел вот так:

Код

typedef struct tagBITMAPINFO {
  BITMAPINFOHEADER bmiHeader;
  RGBQUAD          bmiColors[1]; // <<<<<<< Потому что
} BITMAPINFO, *PBITMAPINFO;

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


Новичок



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

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



Спасибо!
Туда заглянуть не хватило мозгов.
PM MAIL   Вверх
nikkadim
Дата 8.8.2012, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(korian @ 7.8.2012,  17:22)
Цитата(nikkadim @  7.8.2012,  15:26 Найти цитируемый пост)
не понял почему, но обошел вот так:

Код

typedef struct tagBITMAPINFO {
  BITMAPINFOHEADER bmiHeader;
  RGBQUAD          bmiColors[1]; // <<<<<<< Потому что
} BITMAPINFO, *PBITMAPINFO;

Означает ли это, что для 16-bit ного изображения надо делать вот так?

Код

    for(int i=0; i<65536; i++)
    {
        info->bmiColors[i].rgbRed = i;
        info->bmiColors[i].rgbGreen = i;
        info->bmiColors[i].rgbBlue = i;
        info->bmiColors[i].rgbReserved = 0;
    }  


Правильно ли я понимаю, что вывести на экран 16-bit grayscale изображение в принципе не возможно, ни под виндой ни под чем  - да?

PS: http://www.qtcentre.org/threads/15518-How-...79032#post79032
PPS: http://forums.codeguru.com/archive/index.php/t-374992.html

Это сообщение отредактировал(а) nikkadim - 8.8.2012, 22:24
PM MAIL   Вверх
Earnest
Дата 9.8.2012, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nikkadim @  8.8.2012,  22:04 Найти цитируемый пост)
Означает ли это, что для 16-bit ного изображения надо делать вот так?

Нет, конечно; 16-битное изображение рассматривается как полноцветное, не как палитровое

Цитата(nikkadim @  8.8.2012,  22:04 Найти цитируемый пост)
Правильно ли я понимаю, что вывести на экран 16-bit grayscale изображение в принципе не возможно, ни под виндой ни под чем  - да?

Насчет "ни под чем" не знаю, а под виндой не получится.
С другой стороны - оно надо? Человек-то и 256 градаций серого едва различает... 

Винде надо  дать распределение битов по каналом - битовую маску той части пиксела, которая отвечает за канал.
Но поскольку рисовать как-то надо, и желательно без доп. преобразований, мы выкручивались так:
битовые маски, оказывается, вполне могут накладываться и даже совпадать. Т.о.  в каждый канал поступает одинаковое значение, в результате - серый цвет. Не 64 тысячи градаций, но посмотреть хватает.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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