Witam,
Pobieram sobie obraz z kamery w timerze. Chciałbym uzyskac obraz tylko ze składową czerwoną. Napisałem sobie więc kod który był połączeniem scanline i pixels, ale jak wiadomo takie połączenie nie jest szybkie...
Napisałem więc kod w oparciu o sam scanline. O tyle działa on w innym programie gdy statycznie wczytuję bitmapę z pliku (bmp.LoadFromFile();) ale gdy umieszcze ten sam kod do timera pobierającego obraz, kod nie dziala, czytaj obraz z kamery jest pobierany i wyświetlany na image'u ale obraz posiada wszystkie składowe zamiast tylko czerwonej. Timer ustawiam na 5 sekund (5000 w timerze). Próbowałem robić to na kopiach tej bitmapy ale tez niedziala. Z góry dziękuję za pomoc.
Btw : Wiem że tworzenie i zwalnianie w timerze bitmapy moze byc troche nieoptymalne ale musialem miec pewnosc ze kod w obu programach bedzie pracowal w podobnym "środowisku"...
procedure TForm1.Timer1Timer(Sender: TObject);
var bmp : TBitmap;
x,y : integer;
linia : PByteArray;
begin
bmp := TBitmap.Create;
//---------ZRZUT DO BITMAPY----------------------------
SendMessage(FCapHandle,WM_CAP_GET_FRAME, 0, 0);
SendMessage(FCapHandle, WM_CAP_COPY, 0, 0);
if Clipboard.HasFormat(CF_Bitmap) then
bmp.LoadFromClipboardFormat(CF_BITMAP, ClipBoard.GetAsHandle( CF_BITMAP), 0);
//-----------------------------------------------------
for y := 0 to bmp.Height-1 Do
begin
linia := bmp.ScanLine[y];
x := 0;
while (x < (bmp.Width-1)*4) do
begin
// linia[x+2] := 0;
linia[x+1] := 0;
linia[x+0] := 0;
Inc(x,4);
end;
end;
//---------------------------------------------------------
{
for y := 0 to bmp.Height-1 do
begin
for x:= 0 to bmp.Width-1 do
bmp.Canvas.Pixels[x,y]:=RGB(GetRValue(bmp.Canvas.Pixels[x,y]),0,0);
end;
}
//---------------------------------------------------------
image2.Canvas.Draw(0,0,bmp);
bmp.Destroy;
end;