Быстрый вывод пикселей на канву

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Быстрый вывод пикселей на канву

Сообщение Alex_123_1 » 28.01.2011 14:55:25

Доброго времени суток.
У меня имеется двумерный массив с пикселями, как бы быстро вывести их на канву собственными средствами, тоесть сторонии компонентами пользоваться нельзя. В делфях я бы создал битмап и посредством сканлайн заполнил бы его, а затем draw на канву. А здесь как быть? попиксельный доступ к канве очень медленный...
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: Быстрый вывод пикселей на канву

Сообщение Odyssey » 28.01.2011 18:24:33

В Lazarus wiki есть немного информации на эту тему, правда на английском.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Быстрый вывод пикселей на канву

Сообщение Alex_123_1 » 28.01.2011 20:21:18

Смотрел там сильно медлено. 254 тиков против 15 на scanline

Но я надыбал способ побыстрее, где-то 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
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: Быстрый вывод пикселей на канву

Сообщение Sheleh » 29.01.2011 12:47:02

Вот очень быстрый попиксельный доступ к битмапу с помощью API. Несколько строчек и не надо никаких дополнительных компонентов.
viewtopic.php?f=5&t=6507&st=0&sk=t&sd=a&start=15
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

Re: Быстрый вывод пикселей на канву

Сообщение Alex_123_1 » 29.01.2011 13:26:50

Sheleh писал(а):Вот очень быстрый попиксельный доступ к битмапу с помощью API. Несколько строчек и не надо никаких дополнительных компонентов.
viewtopic.php?f=5&t=6507&st=0&sk=t&sd=a&start=15


Пока не смотрел - сорри.
Это случайно не платформо зависимый сбособ? А то меня слово API напрягло. Если да, тады ой, не подойдет...
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: Быстрый вывод пикселей на канву

Сообщение Sheleh » 31.01.2011 07:35:53

Это очень быстрый и удобный способ, работает на Win32 и WinCE.
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

Рейтинг@Mail.ru
cron