Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Hilfe! mein Scanline ist Kaputt! (https://www.delphipraxis.net/123451-hilfe-mein-scanline-ist-kaputt.html)

xy124 2. Nov 2008 11:29


Hilfe! mein Scanline ist Kaputt!
 
was mach' ich falsch?
Delphi-Quellcode:
procedure vergleichebilder2;
var x,y,d1, d2: integer;
begin
  for y:=1 to 239 do begin
    farbe1 := bmp1.ScanLine[y];
    farbe2 := bmp2.ScanLine[y];
    for x:= 1 to 319 do begin
      d1:=round((farbe1^[1]+farbe1^[2]+farbe1^[0])/3);
      d2:=round((farbe2^[1]+farbe2^[2]+farbe2^[0])/3);
      if not((d1+10>d2) and (d1-10<d2)) then begin //anders
        farbe2^[1]:= 0;
        farbe2^[2]:= 0;
        farbe2^[0]:= 255;

        //setcursorpos(x+form3.Left+form3.image2.left,y+form3.top+form3.image2.top);
      end;


      inc(farbe1);
      inc(farbe2);
    end;
  end;
  form3.Image3.Picture.Bitmap := bmp2;
end;
eigentlich möchte ich mithilfe dieser Prozedur Pixel, die eine ganz andere Helligkeit haben Rot färben! Aber es will nicht!
Das heißt, die Feststellung von Pixeln mit anderer Helligkleit klappt soweit aber das ändern der Farbe der Pixel geht nicht!
Auf meinem Bitmap erscheint immer das bmp2 wie es schon vorher war und nicht mit geänderten Farbwerten!

hoffe ihr könnt mir helfen :love:

chest3rs 2. Nov 2008 12:44

Re: Hilfe! mein Scanline ist Kaputt!
 
Hallo xy,

so funktioniert es:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x,y,d1,d2: Integer;
  color: LongInt;
  r,g,b: Byte;
begin
  for y := 1 to Image1.Height do
  begin
    for x := 1 to Image1.Width do
    begin
      // 1. Bild
      color := ColorToRGB(Image1.Picture.Bitmap.Canvas.Pixels[x,y]);
      r := GetRValue(color);
      g := GetGValue(color);
      b := GetBValue(color);
      d1 := (r+g+b) div 3;
      // 2. Bild
      color := ColorToRGB(Image2.Picture.Bitmap.Canvas.Pixels[x,y]);
      r := GetRValue(color);
      g := GetGValue(color);
      b := GetBValue(color);
      d2 := (r+g+b) div 3;
      // Farben vergleichen
      if d1 <> d2 then
        Image2.Picture.Bitmap.Canvas.Pixels[x,y] := RGB(255,0,0);
    end;
  end;
end;

inherited 2. Nov 2008 12:54

Re: Hilfe! mein Scanline ist Kaputt!
 
Bloß nicht, das ist ineffektiv und langsam.

Was mir in dem Code auffällt, ist dass du am Ende eine solche zuweisung machst:

form3.Image3.Picture.Bitmap := bmp2;

Leider kann ich nirgendwo entdecken, wo bmp2 oder bmp1 zugewiesen wird. Eine solche Zuweisung macht eigentlich selten Sinn. Wenn du das Bild kopieren willst, solltest du form3.Image3.Picture.Bitmap.Assign(bmp2) nehmen.
Wenn das nicht hilft, musst du mal mehr Code zeigen, besonders den, wo du bmp1 und 2 initialisierst oder zuweist.

Blup 3. Nov 2008 11:08

Re: Hilfe! mein Scanline ist Kaputt!
 
Zitat:

Zitat von xy124
was mach' ich falsch?

- Zugriff auf Zeilen und Spalten richtig: 0..239, 0..319
- Die Addition der Farbwerte(Byte) ergibt wahrscheinlich einen Überlauf, da vorher keine Typumwandlung erfolgt.
- Der Durchschnitt aus allen drei Farbwerten ist nur eine grobe Vereinfachung der Helligkeit.
- Die Deklaration von Farbe1 und Farbe2 ist nicht aufgeführt, der eigentliche Fehler ist da zu vermuten.

Delphi-Quellcode:
uses
  GraphUtil;

type
  TBGR = packed record
    B, G, R: Byte;
  end;

procedure vergleichebilder2(bmp1, bmp2: TBitmap; dMax: Word);
var
  Farbe1, Farbe2: ^TBGR;
  Hue1, Luminance1, Saturation1,
  Hue2, Luminance2, Saturation2: Word;
  x, y, xMax, yMax, d: Integer;
begin
  yMax := Min(bmp1.Height, bmp2.Height) - 1;
  xMax := Min(bmp1.Width, bmp2.Width) - 1;
  bmp1.Pixelformat := pf24Bit;
  bmp2.Pixelformat := pf24Bit;

  for y := 0 to yMax do
  begin
    Farbe1 := bmp1.ScanLine[y];
    Farbe2 := bmp2.ScanLine[y];
    for x := 0 to xMax do
    begin
      ColorRGBToHLS(RGB(Farbe1^.R, Farbe1^.G, Farbe1^.B), Hue1, Luminance1, Saturation1);
      ColorRGBToHLS(RGB(Farbe2^.R, Farbe2^.G, Farbe2^.B), Hue2, Luminance2, Saturation2);
      {Umwandlung zu Integer für Differenzberechnung mit Vorzeichen}
      d := Integer(Luminance1) - Integer(Luminance2);
      if ABS(d) > dMax then
      begin
        farbe2^.B := 0;
        farbe2^.G := 0;
        farbe2^.R := 255;
      end;
      Inc(Farbe1);
      Inc(Farbe2);
    end;
  end;
end;
Bei mir erfolgreich getestet.

xy124 3. Nov 2008 15:38

Re: Hilfe! mein Scanline ist Kaputt!
 
also erstmal größten dank für eure Antworten! :thumb:

@chest3rs: wie inherited schon gesagt hat ist mir das zu langsam

@inherited: mit form3.image3.Picture.Bitmap.assign(bmp2) passiert genau das gleiche wie mit Picture.Bitmap := bmp2

so jetzt mal mehr code:
Delphi-Quellcode:
type
  pixel = array[0..2] of byte;

var
  Form3: TForm3;
  bmp1, bmp2: Tbitmap;
  farbe1: ^Pixel;
  farbe2: ^Pixel;

//^^das wird alles gaaanz am anfang deklariert, damit ich Rechenleistung spare!

procedure TForm3.FormCreate(Sender: TObject);
begin
  bmp1:=TBitmap.create;
  bmp2:=Tbitmap.create;
  bmp1.PixelFormat := pf24Bit;
  bmp2.PixelFormat := pf24Bit;
end;

Zitat:

Zitat von Blup
- Zugriff auf Zeilen und Spalten richtig: 0..239, 0..319

ja das bild ist immer 320x240 px groß!
Zitat:

Zitat von Blup
- Die Addition der Farbwerte(Byte) ergibt wahrscheinlich einen Überlauf, da vorher keine Typumwandlung erfolgt.

^^ich weiß zwar nicht genau was du damit meinst, aber eine Fehlermeldung kommt nicht und die angezeigten Werte beim Debuggen schienen zu stimmen!
Zitat:

Zitat von Blup
- Der Durchschnitt aus allen drei Farbwerten ist nur eine grobe Vereinfachung der Helligkeit.

ok nehm' ich in kauf, es geht mir vorerst eher um's Prinzip...

so und Blup's code teste ich jetzt mal...

xy124 3. Nov 2008 16:13

Re: Hilfe! mein Scanline ist Kaputt!
 
Juhuuuuuuuuu ich hab' die Lösung! Danke vor allem dir Blup! das kopieren deines Codes in mein Projekt und dann das "synchronisieren" mit meinem Code brachte die Lösung!

in meinem code fehlten nur 2 zeilen:
Delphi-Quellcode:
procedure vergleichebilder2;
var x,y,d1, d2: integer;
begin
///////////////////////////////
  bmp1.pixelformat:= pf24bit;//an diesen beiden Zeilen liegt's
  bmp2.pixelformat:= pf24bit;//...
///////////////////////////////
  for y:=1 to 239 do begin
    farbe1 := bmp1.ScanLine[y];
    farbe2 := bmp2.ScanLine[y];
.
.
.
komisch das es delphi nicht genügt wenn man das Pixekformat einmal in Formcreate festlegt...


also danke danke danke! :corky: :thumb: :party:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz