[Gelöst] Änderungen am Bitmap werden nicht übernommen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

[Gelöst] Änderungen am Bitmap werden nicht übernommen

Beitrag von ConcAPPtLab »

Hallo Community,

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;


Es wird am Schluss auf Panel3 auch ein Bild gezeichnet. Allerdings ist es einfach nur ein Foto der Form. Unverändert. Als ob das Bitmap FormBmp nicht mit Weich() bearbeitet worden wäre-

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
Zuletzt geändert von ConcAPPtLab am Sa 27. Feb 2016, 17:29, insgesamt 1-mal geändert.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Änderungen am Bitmap werden nicht übernommen

Beitrag von ConcAPPtLab »

Okay, alles klar. Ich habe den "Fehler" gefunden.

Für alle, die das gleiche Problem haben sollten: Es gibt tatsächlich solch einen "Update-Befehl" wie bei BGRABitmap. Hier scheint er BeginUpdate(true) zu heißen. Ist mir beim durchzappen durch die möglichen Prozeduren aufgefallen.
Dieser Befehl muss nach einer (oder mehrer?) Zeigeränderungen eingefügt werden.

Sollte diese Art und Weise immer noch nicht das Gelbe vom Ei sein, antwortet ruhig auf diesen Thread :)

Grüße
ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Antworten