Тема: 4 bit HBitmap
Показать сообщение отдельно
  #1  
Старый 07.03.2017, 17:12
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию 4 bit HBitmap

Здравия всем!

Столкнулся с некоторой проблемкой при работе с HBitmap;
Использую WinAPI. Суть - Не могу сделать SelectObject на 4 битный битмап.
Использую именно 4 битный, т.к. графические данные подготовлены в 16 цветной индексированной палитре, поэтому переводить в 32 бит - затратно для производительности приложения.

Вот пример использования:
Код:
Const
data2: array[0..63] of byte = (
	$00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00,
  $00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00,
  $00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00,
  $00, $00, $00, $00, $01, $00, $01, $00, $41, $00, $71, $00, $55, $00, $7C, $00
);
...

procedure TForm1.Button1Click(Sender: TObject);
var
HDC:THandle;
BufferImages:HBitmap;
BDC:THandle;
Select:LongWord;
begin
Image1.Picture.Bitmap.Width:=8;
Image1.Picture.Bitmap.Height:=8;
HDC:=Image1.Picture.Bitmap.Canvas.Handle;
BufferImages:=CreateBitmap(8,8,1,4,@data2); //??? 
BDC:=CreateCompatibleDC(HDC);
Select:= SelectObject(BDC,BufferImages);
if Select =0 then ShowMessage('Selected error');
BitBlt(HDC,0,0,8,8,BDC,0,0,SRCCOPY);
ReleaseDC(BDC,BufferImages);
DeleteDC(BDC);
DeleteObject(BufferImages);

end;
Вот почему, если я создаю
CreateBitmap(8,8,1,1,@data2) - то нормально, а если:
CreateBitmap(8,8,1,4,@data2) - то SelectObject = 0 и соответственно на контексте ничего. Аналогичная ошибка при 8, 16 битах, а 32 понятно норм.
При этом сам CreateBitmap возвращает идентификатор в любом случае.
а установка
Код:
Image1.Picture.Bitmap.PixelFormat:=pf4bit;
ничего не даёт;

Пробовал использовать CreateDIBSelection, SetDIBits, StretchDiBits - не помогает.
SetDIBits и StretchDiBits что-то пытаются, но слишком геморно.

Собственно вопрос как отрисовать 4 битный битмап (на 32 битном контексте)?
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием