Autor |
Beitrag |
violinenspieler1000
      
Beiträge: 38
|
Verfasst: Di 29.07.08 15:46
Hallo,
ich habe ein Bild in eine Image-Box geladen. Wie kann ich das Bild auf Pixel untersuchen, d.h. z.B. herausfinden welche Farbe der Pixel bei 100|200 hat?
Danke,
Thomas
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Di 29.07.08 15:57
Kleines Beispiel wie man farben manipulieren kann.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var farbe: tColor; rot,gruen,blau: Byte; [..]
farbe := image1.canvas.pixels[100,200]; rot := getRVAlue(farbe); gruen := getGValue(farbe); blau := getBVAlue(farbe);
rot := 255-rot; farbe := RGB(rot,gruen,blau); image1.canvas.pixels[100,200] := farbe; |
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
violinenspieler1000 
      
Beiträge: 38
|
Verfasst: Mi 30.07.08 11:32
Hallo,
leider funktioniert das bei mir nicht richtig.
Zuerst lade ich ein Bild in die ImageBox:
Delphi-Quelltext 1:
| image1.Picture.LoadFromFile('C:\Users\xyz\Desktop\test1 |
Dann versuche ich ich den Pixel auszulesen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| farbe := image1.picture.bitmap.Canvas.pixels[4,3];
rot := getRVAlue(farbe); gruen := getGValue(farbe); blau := getBVAlue(farbe);
showmessage(inttostr(rot)); showmessage(inttostr(gruen)); showmessage(inttostr(blau)); |
2 Probleme treten auf:
1. Das Bild verschwindet
2. Egal was ich mache, es wird als Farbe immer schwarz ausgegeben.
Hat jemand eine Idee, wie man die Probleme beseitigen kann?
Thomas
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 30.07.08 12:10
Versuchs mal mit image1.canvas.
mfg
|
|
violinenspieler1000 
      
Beiträge: 38
|
Verfasst: Mi 30.07.08 12:19
Danke, aber leider funktioniert das nicht:
Delphi-Quelltext 1:
| image1.canvas.LoadFromFile('C:\Users\xyz\Desktop\test1'); |
Da bekomme ich die Fehlermeldung Undefinieeter Bezeichner.
Delphi-Quelltext 1:
| farbe := image1.Canvas.pixels[4,3]; |
Dann gibt es eine Debugging Exception mit "Bild kann nur geändert werden, wenn es eine Bitmap enthält"
Thomas
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 30.07.08 12:23
Das loadfromfile kannst du ja auch so lassen wie es war, ich bezog mich lediglich auf das Canvas.
Sprich:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| image1.Picture.LoadFromFile('C:\Users\xyz\Desktop\test1');
farbe := image1.Canvas.pixels[4,3]; rot := getRVAlue(farbe); gruen := getGValue(farbe); blau := getBVAlue(farbe);
showmessage(inttostr(rot)); showmessage(inttostr(gruen)); showmessage(inttostr(blau)); |
Bitte benutze auch du am besten die Delphi-Tags( [ Delphi] DEIN CODE[ /Delphi] ), damit dein Code übersichtlich angezeigt wird.
mfg
|
|
violinenspieler1000 
      
Beiträge: 38
|
Verfasst: Mi 30.07.08 12:30
Hallo,
das funktioniert es wie gesagt leider nicht:
es gibt eine Debugging Exception mit "Bild kann nur geändert werden, wenn es eine Bitmap enthält"
Obwohl ich nicht weiß, warum das Bild geändert werden soll.
Thomas
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mi 30.07.08 12:33
Was für eine Bilddatei lädst du denn?
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
violinenspieler1000 
      
Beiträge: 38
|
Verfasst: Mi 30.07.08 12:37
Ich lade .jpg. Unter uses habe ich jpeg eingetragen. Das Bild wird auch nach dem Laden angezeigt.
Thomas
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mi 30.07.08 13:03
Hm, hab grad kein Delphi zur Hand und kann es nicht testen. Aber wenn es an dem JPG liegt, könnte es abhilfe schaffen wenn du dieses in ein Bitmap umwandelst, etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| uses jpeg; [..] var mein_jpeg: TJpegImage; mein_bmp: tBitmap;
begin mein_jpeg := TJpegImage.Create; mein_jpeg.loadfromfile(bla); mein_bmp := tBitmap.Create; mein_bmp.width := mein_jpeg.width; mein_bmp.height := mein_jpeg.height; mein_bmp.draw(0,0,mein_jpeg);
image1.picture := mein_bmp; |
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 30.07.08 13:24
Erstmal: Was willst du erreichen? Erzähl uns bitte noch ein wenig mehr Hintergrundinformationen.
Zum Bearbeiten verwendest du lieber TBitmap, wie Tilman schon schrieb. Allerdings gefällt mir seine Methode zum Unwandeln nicht so ganz
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var Bitmap: TBitmap; JPEG: TJPEGImage; begin Bitmap := TBitmap.Create; try JPEG := TJPEGImage.Create; try JPEG.LoadFromFile(Dateiname); Bitmap.Assign(JPEG); finally JPEG.Free; end;
finally Bitmap.Free; end; end; |
Dann kannst du über die Eigenschaft Bitmap.Canvas.Pixels die Farbe eines einzelnen Pixels auslesen.
Das kommt jetzt im oberen Code dort rein, wo der Kommentar steht.
Delphi-Quelltext 1:
| Farbe := Bitmap.Canvas.Pixels[100, 200]; |
Was danach kommt, hängt von deiner Absicht ab. Du könntest zum Beispiel den Hexwert der Farbe einfach mal anzeigen lassen:
Delphi-Quelltext 1:
| ShowMessage(IntToHex(Farbe, 8)); |
Edit:: HexToStr korrigiert zu IntToHex
Zuletzt bearbeitet von Yogu am Mi 30.07.08 13:46, insgesamt 2-mal bearbeitet
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Mi 30.07.08 13:39
HexToStr, gibt es (jedenfalls bei mir) nicht, höchstens IntToHex, wobei der Rückgabetyp ein string ist.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 30.07.08 13:45
Jakob_Ullmann hat folgendes geschrieben: | HexToStr, gibt es (jedenfalls bei mir) nicht, höchstens IntToHex, wobei der Rückgabetyp ein string ist. |
Oh, der Fehler passiert mir oft. Habs korrigiert. 
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 01.08.08 11:57
Vielleicht fehlt ihm auch einfach nur das hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| image1.Picture.LoadFromFile('C:\Users\xyz\Desktop\test1.jpg');
farbe := image1.Canvas.pixels[4,3]; rot := getRVAlue(farbe); gruen := getGValue(farbe); blau := getBVAlue(farbe);
showmessage(inttostr(rot)); showmessage(inttostr(gruen)); showmessage(inttostr(blau)); |
Sollte das nicht gehen ist eine Umwandlung in BMP erforderlich.
mfg
|
|
bensch
      
Beiträge: 44
|
Verfasst: Di 30.03.10 11:19
Und warum kann man das Pixel eines jpg-Bildes nicht mit oben genannter Methode auslesen?
Es muss doch irgend eine Möglichkeit geben, ein Pixel eines jpg-Bildes auszugeben, ohne es umzuwandeln.
Denn ich wollte 2 gleiche Bilder miteinander vergleichen. Ein Bild ist ein komprimiertes, und das 2te Bild wäre das original. Nun möchte ich überprüfen, ob die Farbwerte eines bestimmten Bildes mit den Farbwerten des Pixels vom original übereinstimmen.
Doch mit folgendem Code erhalte ich bei jpg-Bildern eine Fehlermeldung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var c: TColor; r, g, b:string; begin
...
c := image1.Canvas.Pixels[0,0]; r := inttostr(getRValue(C)); g := inttostr(getGValue(C)); b := inttostr(getBValue(C)); showmessage(r+' '+g+' '+b);
... |
das Bild habe ich in ein Timage geladen, wird auch angezeigt, aber beim Auslesen kommt die Fehlermeldung: " Bild kann nur geändert werden, wenn es ein Bitmap enthält".
Wie weiter oben bereits steht, funktioniert das Auslesen bei einem bmp problemlos, nur bei jpg zickt der Code rum. Gibt es da irgend eine Möglichkeit, ein Pixel eines jpg-Bildes auszulesen, ohne dass die "echten Farbwerte" des Bildes durch Konvertierung (evtl. in ein anderes Bildformat) verfälscht werden?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 30.03.10 11:56
Moin!
bensch hat folgendes geschrieben : | Und warum kann man das Pixel eines jpg-Bildes nicht mit oben genannter Methode auslesen? |
Weil die Daten in komprimierter Form vorliegen, du also keinen direkten Zugriff auf die Bilddaten hast.
bensch hat folgendes geschrieben : | Es muss doch irgend eine Möglichkeit geben, ein Pixel eines jpg-Bildes auszugeben, ohne es umzuwandeln. |
AFAIK - nein.
bensch hat folgendes geschrieben : | das Bild habe ich in ein Timage geladen, wird auch angezeigt, aber beim Auslesen kommt die Fehlermeldung: "Bild kann nur geändert werden, wenn es ein Bitmap enthält". |
Das ist korrekt, da die Windows-Bitmap-API nur mit Bitmaps klar kommt.
bensch hat folgendes geschrieben : | Gibt es da irgend eine Möglichkeit, ein Pixel eines jpg-Bildes auszulesen, ohne dass die "echten Farbwerte" des Bildes durch Konvertierung (evtl. in ein anderes Bildformat) verfälscht werden? |
Ähm, beim Konvertieren von JPG in BMP geht nix verloren, nur umgekehrt.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 30.03.10 12:04
Bindest du auch die Unit jpeg ein? Wenn nicht, kommen vielleicht daher diverse Probleme...
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
bensch
      
Beiträge: 44
|
Verfasst: Di 30.03.10 16:24
Ja, die jpg-Unit habe ich eingebunden.
@ Narses: Bist du dir sicher, dass beim Umwandeln von jpg in bmp die Farben nicht verfälscht werden? Denn wenn ich ein komprimiertes jpg mit dem Original auf Farbabweichungen abgleichen will, wäre es ja unsinnig, wenn durch eine Konvertierung die Farbe verfälscht wird und ich dann das verfälschte Bild mit dem Original vergleiche.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 30.03.10 16:56
Moin!
bensch hat folgendes geschrieben : | Bist du dir sicher, dass beim Umwandeln von jpg in bmp die Farben nicht verfälscht werden? |
Solange du als PixelFormat min. pf24Bit verwendest, ja.
bensch hat folgendes geschrieben : | Denn wenn ich ein komprimiertes jpg mit dem Original auf Farbabweichungen abgleichen will, wäre es ja unsinnig, wenn durch eine Konvertierung die Farbe verfälscht wird und ich dann das verfälschte Bild mit dem Original vergleiche. |
Nochmal zum mitlesen:
BMP -> JPG lossy-compression, die Bilddaten sind nicht mehr bit-identisch zum BMP
JPG -> BMP (>=pf24bit) losless, die Bilddaten des JPGs sind identisch im BMP wiederzufinden.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: Di 30.03.10 18:10
_________________ Salus populi suprema lex esto
|
|