Получить битовый массив! Ни фига не выходит%-( ) ?
От: Погуляй Россия  
Дата: 15.11.01 23:56
Оценка:
Милостивые государи! Умоляю, объясните снисходительно, как правильно получить битовый массив для указанного HBITMAP?!
Именно указалку на саму последовательность RGB-байт, без всего
прочего? Создаю битмап через CreateCompatibleBitmap для контекста,
полученного через CreateCompatibleDC, рисую на него, смотрю атрибуты пикселов через GetPixel- OK! Но вот получить поинтер ну никак не могу!дает через GetObject структ. BITMAP,все там верно,
только bmBits=NULL. Пытаюсь дернуть в буфер через GetBIBits-не работает, даже BITMAPINFO при нул-поинтере буфера не заполняет,
возвращает лишь убийственно круглый НОЛЬ! При попытке обращаться
к HBITMAP через дебаггер при переходе на адрес битмапа кажет '?',
читать с этого адреса не дает- ошибка доступа даже на чтение...
Делается все это на MSVC6, под Винным 2000.
ПАМАГИТЕ!!!!
Re: Получить битовый массив! Ни фига не выходит%-( ) ?
От: ААШ Россия asa.1gb.ru
Дата: 16.11.01 01:51
Оценка:
Здравствуйте Погуляй, Вы писали:

П>Милостивые государи! Умоляю, объясните снисходительно, как правильно получить битовый массив для указанного HBITMAP?!

П>ПАМАГИТЕ!!!!

Помогаю:

DWORD x;
struct
{
BITMAPINFO bi;
DWORD qqq[3];
} bi;
memset(&bi,0,sizeof(bi));

bi.bi.bmiHeader.biSize=sizeof(bi.bi.bmiHeader);
bi.bi.bmiHeader.biBitCount=0;
x=GetDIBits(hdc,hb,0,0,0,&bi.bi,DIB_RGB_COLORS);

if(!x)return 1;
x=Create(bi.bi.bmiHeader.biWidth,bi.bi.bmiHeader.biHeight);
if(!x)return 1;
bi.bi.bmiHeader.biSizeImage=sizeof(DWORD)*height*width;
bi.bi.bmiHeader.biBitCount=32;
bi.bi.bmiHeader.biCompression=BI_RGB;
bi.bi.bmiHeader.biHeight=-bi.bi.bmiHeader.biHeight;

x=GetDIBits(hdc,hb,0,height,data,&bi.bi,DIB_RGB_COLORS);
Re: Получить битовый массив! Ни фига не выходит%-( ) ?
От: Lom  
Дата: 16.11.01 06:20
Оценка:
Здравствуйте Погуляй, Вы писали:

П>Милостивые государи! Умоляю, объясните снисходительно, как правильно получить битовый массив для указанного HBITMAP?!

П>Именно указалку на саму последовательность RGB-байт, без всего
П>прочего? Создаю битмап через CreateCompatibleBitmap для контекста,
П>полученного через CreateCompatibleDC, рисую на него, смотрю атрибуты пикселов через GetPixel- OK! Но вот получить поинтер ну никак не могу!дает через GetObject структ. BITMAP,все там верно,
П>только bmBits=NULL. Пытаюсь дернуть в буфер через GetBIBits-не работает, даже BITMAPINFO при нул-поинтере буфера не заполняет,
П>возвращает лишь убийственно круглый НОЛЬ! При попытке обращаться
П>к HBITMAP через дебаггер при переходе на адрес битмапа кажет '?',
П>читать с этого адреса не дает- ошибка доступа даже на чтение...
П>Делается все это на MSVC6, под Винным 2000.
П>ПАМАГИТЕ!!!!

Скорее всего проблема в том что цветность hdc не соответсвует цветности той bmp из которой ты читаешь биты.
Например цветность экрана 16 бит. Получаем от него hdc при помощи GetDC(NULL). Создаем битмап с цветность 24 бита и рисуем на нем. При попытке вызова GetDIBits получаем 0.
Как решить эту проблему я не знаю. Поэтому просто следи за совпадением цветности
Re: Получить битовый массив! Ни фига не выходит%-( ) ?
От: KaSA  
Дата: 16.11.01 07:59
Оценка:
Здравствуйте Погуляй, Вы писали:

Есть способ проще, чем вышеописанный, ИМХО.
Создавай битмап не ч\з CreateCompatibleBitmap, а через
CreateDIBSection(), тогда проблема с получением поинтера
исчезнет (т.к ты его получишь в момент создания битмапа),
как и проблема с глубиной цвета :)
Причем, в последствии, ф-ия BitBlt сама переконвертит
битмап в нужный формат...
Да, в параметре HDC советую передавать NULL (это для CreateDIBSection)

Удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.