есть DIbitmap одного формата (скажем, 24 битный)
хочется сделать bitmap другого формата, из которого можно было бы взять адрес data
я нашел два способа — оба не работают
исходная битмап лежит по адресу buffer_start, описание bi (типа BITMAPINFO)
через DDB
hbmp=CreateCompatibleBitmap(dc->m_hDC,nx,ny);
SetDIBits(NULL,hbmp,0,100,buffer_start,&bi,DIB_RGB_COLORS);
bmp=CBitmap::FromHandle(hbmp);
bmp->GetBitmap(&binfo);
после этого поле binfo.bmDits== 0x00000000
через DIB
bits = new char[nx*ny*4];
hbmp=CreateBitmap(fr->row_pixels,fr->row_count,1,24,bits);
SetDIBits(NULL,hbmp,0,100,buffer_start,&bi,DIB_RGB_COLORS);
— в этой версии не выполняется функция SetDIBits (и вроде не должна)
Как быть — очень хочется чтоб работало быстро и без лишних копирований битмапа
Здравствуйте, Uras, Вы писали:
U>есть DIbitmap одного формата (скажем, 24 битный)
U>хочется сделать bitmap другого формата, из которого можно было бы взять адрес data
Лучше всего руками

Не так уж там много возможных преобразований. Зато будут быстро работать.
Чепез DC можно так:
1) Создать 2 DC в памяти через CreateCompatibleDC.
2) Создать пустой битмап требуемого формата через CreateDIBSection и выбрать его в один контекст устойства.
3) Исходный битмап выбрать во второй контекст
4) BitBlt из второго контекста в первый.
5) Освободить оба битмапа: вот быты и готовы
P.S. Если что напутал, извини

12 часов сегодня работал.
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Лучше всего руками
Не так уж там много возможных преобразований. Зато будут быстро работать.
ДМ>Чепез DC можно так:
ДМ>1) Создать 2 DC в памяти через CreateCompatibleDC.
ДМ>2) Создать пустой битмап требуемого формата через CreateDIBSection и выбрать его в один контекст устойства.
ДМ>3) Исходный битмап выбрать во второй контекст
ДМ>4) BitBlt из второго контекста в первый.
ДМ>5) Освободить оба битмапа: вот быты и готовы
как утверждает MSDN и как показывает практика, одновременно в системе только один битмап может быть выбран в контекст, даже если контексты разные
Здравствуйте, Uras, Вы писали:
U>Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>>Лучше всего руками
Не так уж там много возможных преобразований. Зато будут быстро работать.
ДМ>>Чепез DC можно так:
ДМ>>1) Создать 2 DC в памяти через CreateCompatibleDC.
ДМ>>2) Создать пустой битмап требуемого формата через CreateDIBSection и выбрать его в один контекст устойства.
ДМ>>3) Исходный битмап выбрать во второй контекст
ДМ>>4) BitBlt из второго контекста в первый.
ДМ>>5) Освободить оба битмапа: вот быты и готовы
U>как утверждает MSDN и как показывает практика, одновременно в системе только один битмап может быть выбран в контекст, даже если контексты разные
Да ну.... и где такаяфигня написана??? Дайте пожалуйста ссылочку. Сколько лет программировал, а такое первый раз слышу.