Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.70.93] |
|
Сообщ.
#1
,
|
|
|
Такая трабла, не могу нормально работать с 256 цветными bitmap'ами. Я хочу у одной битмапы данные GetDIBits, что нить с ними сделать, с сунуть в другую. SetDIBits.
Причем при 24 битном цвете все работает нормлаьно, а когда 8 бит, там мутотень с палитрой, и функции как-то коряво работают. так GetDIBits в массив выводит порядка 1000 элементов для картинки 10х10 хотя при 24битном цвете она выводила в массив 320 эл-тов. SetDIBits возвращает 0, то есть ошибка, GetLastError() тоже возвращает 0?? (вынь2000) дык а если битмапу не выбирать в контекст до GetDIBits, а сделать это после ее вызова, то вообще ничего не выводиться на экран. в чем может быть дело? кусок кода: char buf[2000]; hbmp=(HBITMAP)LoadImage(0,"bmp.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); // SelectObject(hdc,hbmp); BITMAPINFO bi; bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth=10; bi.bmiHeader.biHeight=10; bi.bmiHeader.biCompression=BI_RGB; bi.bmiHeader.biPlanes=1; bi.bmiHeader.biSizeImage=0; bi.bmiHeader.biBitCount=8; bi.bmiHeader.biClrUsed=2; bi.bmiHeader.biClrImportant=2; int res=GetDIBits(hdc,hbmp,0,10,buf,&bi,DIB_RGB_COLORS); char buf1[1000]; // memset(bi.bmiColors,40,3*192); примерыы того, что можно делать // memset(buf+3,2,1); на самом деле чусть сложнее HBITMAP hb=CreateBitmap(10,10,1,8,buf1);//=CreateCompatibleBitmap(hcdc,10,10); // SelectObject(hcdc,hbmp); res=SetDIBits(hdc,hb,0,10,buf,&bi,DIB_RGB_COLORS); res=(GetLastError()); //int res=SetBitmapBits(hb,r,lp); //GetBitmapBits(hbmp,1900,buf) SelectObject(hcdc,hb); BitBlt(hdc,200,200,210,210,hcdc,0,0,SRCCOPY); причем от того, какие dc я скармливаю функциям hdc или hcdc ничего (почти ) независит... при 24 битном цвете все работает нормально.. Заранее благодарен |
Сообщ.
#2
,
|
|
|
самое простое переделать :(из 256 в 24 а затем обратно
|
Сообщ.
#3
,
|
|
|
Ошибка в том, что при вызове GetDIBits в структуре BITMAPINFOHEADER заполняются только первые шесть параметров, т.е.:
DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; т.е. GetDIBits перед занесением битов в память конвертирует исходный растр в требуемый. При соответсвии BITMAPINFOHEADER исходному растру выполняется прямой перенос битов. все остальные параметры BITMAPINFOHEADER игнорируются. Как выполняется конвертация цветов при переходе из одного формата в другой, описано в хелпе по GetDIBits. |