![]() |
|
|
#1
|
||||
|
||||
|
Здравия всем!
Столкнулся с некоторой проблемкой при работе с 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 битном контексте)? |