AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Hilfe! mein Scanline ist Kaputt!
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe! mein Scanline ist Kaputt!

Ein Thema von xy124 · begonnen am 2. Nov 2008 · letzter Beitrag vom 3. Nov 2008
Antwort Antwort
xy124

Registriert seit: 3. Dez 2007
146 Beiträge
 
Delphi 7 Personal
 
#1

Hilfe! mein Scanline ist Kaputt!

  Alt 2. Nov 2008, 11:29
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
o o
LJ
TTT
  Mit Zitat antworten Zitat
chest3rs

Registriert seit: 15. Okt 2006
Ort: Berlin
84 Beiträge
 
Delphi 7 Personal
 
#2

Re: Hilfe! mein Scanline ist Kaputt!

  Alt 2. Nov 2008, 12:44
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;
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Hilfe! mein Scanline ist Kaputt!

  Alt 2. Nov 2008, 12:54
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.
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Hilfe! mein Scanline ist Kaputt!

  Alt 3. Nov 2008, 11:08
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.
  Mit Zitat antworten Zitat
xy124

Registriert seit: 3. Dez 2007
146 Beiträge
 
Delphi 7 Personal
 
#5

Re: Hilfe! mein Scanline ist Kaputt!

  Alt 3. Nov 2008, 15:38
also erstmal größten dank für eure Antworten!

@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 von Blup:
- Zugriff auf Zeilen und Spalten richtig: 0..239, 0..319
ja das bild ist immer 320x240 px groß!
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 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...
o o
LJ
TTT
  Mit Zitat antworten Zitat
xy124

Registriert seit: 3. Dez 2007
146 Beiträge
 
Delphi 7 Personal
 
#6

Re: Hilfe! mein Scanline ist Kaputt!

  Alt 3. Nov 2008, 16:13
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!
o o
LJ
TTT
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 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