![]() |
Hilfe! mein Scanline ist Kaputt!
was mach' ich falsch?
Delphi-Quellcode:
eigentlich möchte ich mithilfe dieser Prozedur Pixel, die eine ganz andere Helligkeit haben Rot färben! Aber es will nicht!
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; 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: |
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; |
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. |
Re: Hilfe! mein Scanline ist Kaputt!
Zitat:
- 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:
Bei mir erfolgreich getestet.
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; |
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:
Zitat:
so und Blup's code teste ich jetzt mal... |
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:
komisch das es delphi nicht genügt wenn man das Pixekformat einmal in Formcreate festlegt...
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]; . . . also danke danke danke! :corky: :thumb: :party: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz