bei meinem aktuellen Problem möchte ich mithilfe von Scanline ein Bitmap weichzeichnen.
Das ist mein Code:
Code: Alles auswählen
procedure Weich(var Bmp: TBitmap; Feld: integer);
type
Pixel = array[0..2] of byte;
var x, y, remind: integer;
i, k: byte;
p, pUp, pDown: ^Pixel;
FeldP: array[0..2] of array of integer;
begin
for y:=0 to Bmp.Height-1 do
begin
p:=Bmp.ScanLine[y];
pUp:=Bmp.ScanLine[y-1];
pDown:=Bmp.ScanLine[y+1];
for x:=0 to Bmp.Width-1 do
begin
for i:=0 to 2 do
begin
SetLength(FeldP[i], 0);
if (y>0) then
begin
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=pUp^[i];
if (x>0) then
begin
Dec(pUp);
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=pUp^[i];
Inc(pUp);
end;
if (x<Bmp.Width-1) then
begin
Inc(pUp);
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=pUp^[i];
Dec(pUp);
end;
end;
if (y<Bmp.Height-1) then
begin
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=pDown^[i];
if (x>0) then
begin
Dec(pDown);
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=pDown^[i];
Inc(pDown);
end;
if (x<Bmp.Width-1) then
begin
Inc(pDown);
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=pDown^[i];
Dec(pDown);
end;
end;
if (x>0) then
begin
Dec(p);
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=p^[i];
Inc(p);
end;
if (x<Bmp.Width-1) then
begin
Inc(p);
SetLength(FeldP[i], length(FeldP[i])+1);
FeldP[i][length(FeldP[i])-1]:=p^[i];
Dec(p);
end;
end;
for i:=0 to 2 do
begin
remind:=p^[i];
for k:=0 to length(FeldP[i])-1 do
begin
remind:=remind+FeldP[i][k];
end;
p^[i]:=Round(remind/(length(FeldP[i])+1));
end;
Inc(p);
Inc(pUp);
Inc(pDown);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var FormBmp: TBitmap;
Img: Timage;
type
Pixel = array[0..2] of byte;
var p: ^Pixel;
i: byte;
begin
FormBmp:=TBitmap.Create;
FormBmp.Width:=Form1.Width;
FormBmp.Height:=Form1.Height;
FormBmp.PixelFormat:=pf24Bit;
FormBmp.Canvas.Draw(0, 0, Form1.GetFormImage);
Weich(FormBmp, 5));
with Panel3 do
begin
Left:=0;
Top:=0;
Width:=Form1.Width;
Height:=Form1.Height;
end;
Panel3.Visible:=true;
Image2.Left:=0;
Image2.Top:=0;
Image2.Width:=Form1.Width;
Image2.Height:=Form1.Height;
Image2.Picture.Assign(FormBmp);
FormBmp.Free;
ShowMessage('Done');
end;
Meine Vermutung: Aus irgendeinem Grund werden Änderungen der Werte der Zeiger nicht übernommen. Als ich diesen nämlich für alle auf 0 setzte (um ein schwarzes Bild zu erzeugen), geschah nichts. Als ich aber ein Rectangle auf Bmp gezeichnet habe, erschien ein Rechteck.
Die Preisfrage: Wieso? Gibt es etwa einen Befehl ähnlich zu BGRBitmap? Dort muss mans chließlich immer ein InvalidateBitmap einbauen, um Änderungen zu übernehmen. Kann mir jemand helfen?
Grüße
ConcAPPtLab