Also...das Prinzip (eine Art Motion Tracking, wenn man so will):
#1
- Ich lese ein Bitmap ein...in diesem Bitmap befindet sich ein oder mehrere Pixel mit einer ganz bestimmten Farbe.
- Ich durchsuche das Bitmap und finde die Position des Pixels und mache in einem Zweiten zur Laufzeit erstellten Bitmap den Pixel an genau derselben Position rot oder blau...irrelevant, ich hebe ihn also hervor
- Ich lese ein weiteres(!) Bitmap ein [bmpIN] und durchsuche ebenfals, dann den gefundenen Pixel wieder auf das zweite Bitmap übertragen
#2
- Dasselbe nur dass ich keine Pixel setze, sondern immer LineTo(x,y) benutze
Vorgehensweise
Jetzt: siehe Oben
hoffentlich später:
- damit es schneller geht das Bitmap zu durchsuchen, alle Farben bis auf die eine zu eleminieren... (so dass ich z.B. nur noch S/W habe)
4 Frames Beispiele:
Video1.jpg (das Endbild bmpOUT)
- so sieht es leider aus
Video0.jpg (von diesen Bildern wird gelesen)
- hier alle 4 Bilder zusammengesetzt...jedes Bild enthält einen Pixel
421 Frames Beispiel mit LineTo:
Lines1.jpg (Endbild bmpOUT)
-So sieht es mit LineTo und Scanline aus
Lines0.jpg (Endbild bmpOUT)
-und so mit Pixels statt Scanline als Suchalgorithmus...so sollte es auch mit scanloine ausschauen
Typ:
Delphi-Quellcode:
type
TRGB32 = packed record
B, G, R, A: Byte;
end;
TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
PRGB32Array = ^TRGB32Array;
Line : PRGB32Array;
BitmapIN.PixelFormat := pf32bit;
BitmapOUT.PixelFormat := pf32bit;
Auch wenn ich versuche auf beiden Bildern dieselben Pixel anzusprechen, so erhalte ich ein eher konfuse Bild? Woran könnte das liegen? Wenn ich das ohne Scanlines mache, also mit Pixels dann dauert es natürlich um einiges länger, aber das Ergebnis ist korrekt :/
Delphi-Quellcode:
for y := 0 to bmpIN.Height - 1 do
begin
Line := bmpIN.ScanLine[y];
Line2 := bmpOUT.ScanLine[y];
for x := 0 to bmpIN.Width - 1 do
begin
if (
(Line[x].R = 0 ) AND
(Line[x].G = 0 ) AND
(Line[x].B In [250..255] )
)
then
begin
Line2[x].B := 255;
Line2[x].R := 0;
Line2[x].G := 0;
Line2[x].A := 0;
end;
end;
end;