Also, ich versuche eine Möglichkeit zu finden, ein Bitmap (abgelegt in einer selbstdefinierten Listenstruktur) in ein anderes zu kopieren und dabei eine Farbe auszulassen, nämlich die, die in der oberen linken Ecke sitzt.
Mit dem Pixelzugriff funktioniert das auch einigermaßen:
Delphi-Quellcode:
procedure TForm1.MapToImagePix(Aug:TBitmap);
var
I,
J:integer;
T:TColor;
BMP:TBitmap;
begin
BMP:=List.CurrentContent as TBitmap;
T:=BMP.Canvas.Pixels[1, 1];
for I:=0 to(BMP.Height-1)do
begin
for J:=0 to(BMP.Width-1)do
begin
if(BMP.Canvas.Pixels[J, I]<>T)
then Aug.Canvas.Pixels[J, I]:=BMP.Canvas.Pixels[J, I];
end;
end;
end;
Der ist mir allerdings zu langsam, da der Mist viel zu oft ausgeführt werden wird
Also hab ich mir eine Version gebaut, die auf Pointern basiert:
Delphi-Quellcode:
type
{...}
TPixRec=record
B,
G,
R:Byte;
end;
PPixRec=^TPixRec;
{...}
procedure TForm1.MapToImagePoi(Aug:TBitmap);
var
I,
J:integer;
P,
Q,
T:PPixRec;
BMP:TBitmap;
begin
BMP:=List.CurrentContent as TBitmap;
T:=BMP.ScanLine[1];
inc(T);
for I:=0 to(BMP.Height-1)do
begin
P:=BMP.ScanLine[I];
Q:=Aug.ScanLine[I];
for J:=0 to(BMP.Width-1)do
begin
if((P^.R<>T^.R)and(P^.G<>T^.G)and(P^.B<>T^.B))then
begin
Q^.R:=P^.R;
Q^.G:=P^.G;
Q^.B:=P^.B;
end;
inc(P);
inc(Q);
end;
end;
end;
Nur irgendwie tut die nicht ganz, was sie soll: Es werden willkürlich einige Pixel von BMP nicht übernommen, wie man im Demoprojekt sieht.
Links die Version mit Pixeln, rechts die Pointervariante.
MfG,
Euer LDer.
P.S. Edit: Bevor ihr sagt, ich sollte das ganze erstmal in ne neue
Unit auslagern, um dann nen
OOP-Header drumzuschrauben: Das habe ich vor, aber erst, wenn ich sicher sein kann, dass meine Methode funktioniert