Witam.
Odtwarzam film za pomoca DSPack'a i chce analizowac kazda klatke filmu. Odczytuje wartosci R, G, B kazdego pixela i na ich podstawie wyliczam srednie wartosci R,G,B dla calej klatki.
Korzystam z Sample Grabbera:
procedure TForm1.SampleGrabberBuffer(sender: TObject; SampleTime: Double;
pBuffer: Pointer; BufferLen: Integer);
var
i, R, G, B, X, Y : Integer;
Bitmap: TBitmap;
begin
f:=f+1;
if CallBack.Checked then
begin
i:=0; R:=0; G:=0; B:=0; X:=0; Y:=0;
Bitmap:= TBitmap.Create;
SampleGrabber.GetBitmap(Bitmap, pBuffer, BufferLen);
while X < Bitmap.Width -1 do
begin
Y:=0;
while Y< Bitmap.Height -1 do
begin
R:=R + GetRValue(Bitmap.Canvas.Pixels[x,y]);
G:=G + GetGValue(Bitmap.Canvas.Pixels[x,y]);
B:=B + GetBValue(Bitmap.Canvas.Pixels[x,y]);
i:=i+1;
Y:=Y+1;
end;
X:=X+1;
end;
Label1.Caption:= Format('Red: %s', [IntToStr(R Div i)]);
Label2.Caption:= Format('Green: %s', [IntToStr(G Div i)]);
Label3.Caption:= Format('Blue: %s', [IntToStr(B Div i)]);
Label4.Caption:= Format('i: %s', [IntToStr(i)]);
end;
// Bitmap.Free;
end;
I problem w tym ze w ten sposob kazda klatka filmu jest przetwarzana prawie przez jedna sekunde !!! A dla przykladu komponent VideoLab robi to w czasie rzeczywistym (20-25 klatek na sek.).
Czy jest jakis sposob aby to przyspieszyc w DSPacku?? Moze jakis inny sposob zamiast kopiowania klatki do Tbitmap (Bo chyba to zżera tyle czasu i pamieci)?
I dlaczego komenda Bitmap.Free wywala mi program??
Dzieki za wszelki podpowiedzi.
Pozdrawiam.