Доброго времени суток.
У меня имеется двумерный массив с пикселями, как бы быстро вывести их на канву собственными средствами, тоесть сторонии компонентами пользоваться нельзя. В делфях я бы создал битмап и посредством сканлайн заполнил бы его, а затем draw на канву. А здесь как быть? попиксельный доступ к канве очень медленный...
Быстрый вывод пикселей на канву
Модератор: Модераторы
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
В Lazarus wiki есть немного информации на эту тему, правда на английском.
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
Смотрел там сильно медлено. 254 тиков против 15 на scanline
Но я надыбал способ побыстрее, где-то 15-16 тиков
юниты
GraphType, LCLIntf, FPimage
Но я надыбал способ побыстрее, где-то 15-16 тиков
Код: Выделить всё
type
PBGRPixel = ^TBGRPixel;
TBGRPixel = packed record
blue, green, red: byte;
end;
...............
procedure TForm1.Button1Click(Sender: TObject);
var
bitmap: Tbitmap;
a, b: integer;
begin
a := GetTickCount;
bitmap := Tbitmap.Create;
bitmap.Width := 1000;
Bitmap.Height := 1000;
Test(bitmap);
canvas.Draw(0, 0, bitmap);
bitmap.Free;
b := GetTickCount;
ShowMessage(IntToStr(b - a));
end;
procedure TForm1.Test(var FBitmap: TBitMap);
var
y: integer;
RawImage: TRawImage;
BitmapHandle, MaskHandle: HBitmap;
FData, FFdata: PBGRPixel;
begin
ReAllocMem(FData, FBitmap.Width * FBitmap.Height * sizeof(TBGRPixel));
FFdata := FData;
/////////////////////////////Здесь можем рисовать
for y := 0 to FBitmap.Height*fbitmap.Width-1 do
begin
FFdata^.red := 0;
FFdata^.Green := 0;
FFdata^.Blue := 255;
Inc(FFdata);
end;
if (FBitmap.Width > 0) and (FBitmap.Height > 0) then
begin
RawImage.Init;
RawImage.Description.Init_BPP24_B8G8R8_BIO_TTB(FBitmap.Width, FBitmap.Height);
RawImage.Description.LineOrder := riloBottomToTop;
RawImage.Data := PByte(FData);
RawImage.DataSize := FBitmap.Width * FBitmap.Height * sizeof(TBGRPixel);
if not RawImage_CreateBitmaps(RawImage, BitmapHandle, MaskHandle, False) then
raise FPImageException.Create('Failed to create bitmap handle');
FBitmap.Handle := BitmapHandle;
FBitmap.MaskHandle := MaskHandle;
end;
FBitmap.Canvas.AntialiasingMode := amOff;
freemem(FData);
FData := nil;
end; юниты
GraphType, LCLIntf, FPimage
Вот очень быстрый попиксельный доступ к битмапу с помощью API. Несколько строчек и не надо никаких дополнительных компонентов.
viewtopic.php?f=5&t=6507&st=0&sk=t&sd=a&start=15
viewtopic.php?f=5&t=6507&st=0&sk=t&sd=a&start=15
-
Alex_123_1
- новенький
- Сообщения: 26
- Зарегистрирован: 24.07.2009 10:02:52
Sheleh писал(а):Вот очень быстрый попиксельный доступ к битмапу с помощью API. Несколько строчек и не надо никаких дополнительных компонентов.
viewtopic.php?f=5&t=6507&st=0&sk=t&sd=a&start=15
Пока не смотрел - сорри.
Это случайно не платформо зависимый сбособ? А то меня слово API напрягло. Если да, тады ой, не подойдет...
Это очень быстрый и удобный способ, работает на Win32 и WinCE.
