Autor Beitrag
violinenspieler1000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 29.07.08 15:57 
Kleines Beispiel wie man farben manipulieren kann.

ausblenden 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; // Wert invertieren

farbe := RGB(rot,gruen,blau); // farbe zturückschreiben
image1.canvas.pixels[100,200] := farbe;

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
violinenspieler1000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 30.07.08 11:32 
Hallo,

leider funktioniert das bei mir nicht richtig.

Zuerst lade ich ein Bild in die ImageBox:
ausblenden Delphi-Quelltext
1:
image1.Picture.LoadFromFile('C:\Users\xyz\Desktop\test1					

Dann versuche ich ich den Pixel auszulesen:
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Mi 30.07.08 12:10 
Versuchs mal mit image1.canvas.

mfg
violinenspieler1000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 30.07.08 12:19 
Danke, aber leider funktioniert das nicht:

ausblenden Delphi-Quelltext
1:
image1.canvas.LoadFromFile('C:\Users\xyz\Desktop\test1');					

Da bekomme ich die Fehlermeldung Undefinieeter Bezeichner.
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 user profile iconTilman schon schrieb. Allerdings gefällt mir seine Methode zum Unwandeln nicht so ganz ;)

ausblenden 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;

    { Hier kommt dann der Code rein }

  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.

ausblenden Delphi-Quelltext
1:
Farbe := Bitmap.Canvas.Pixels[100200];					

Was danach kommt, hängt von deiner Absicht ab. Du könntest zum Beispiel den Hexwert der Farbe einfach mal anzeigen lassen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Mi 30.07.08 13:39 
HexToStr, gibt es (jedenfalls bei mir) nicht, höchstens IntToHex, wobei der Rückgabetyp ein string ist.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 30.07.08 13:45 
user profile iconJakob_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. :oops:
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 01.08.08 11:57 
Vielleicht fehlt ihm auch einfach nur das hier:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 30.03.10 11:56 
Moin!

user profile iconbensch hat folgendes geschrieben Zum zitierten Posting springen:
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. :idea:

user profile iconbensch hat folgendes geschrieben Zum zitierten Posting springen:
Es muss doch irgend eine Möglichkeit geben, ein Pixel eines jpg-Bildes auszugeben, ohne es umzuwandeln.
AFAIK - nein.

user profile iconbensch hat folgendes geschrieben Zum zitierten Posting springen:
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. :nixweiss:

user profile iconbensch hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 30.03.10 16:56 
Moin!

user profile iconbensch hat folgendes geschrieben Zum zitierten Posting springen:
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. ;)

user profile iconbensch hat folgendes geschrieben Zum zitierten Posting springen:
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: :zwinker:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: Di 30.03.10 18:10 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbensch hat folgendes geschrieben Zum zitierten Posting springen:
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. :idea:

Mit Canvas greife ich doch aber auf den Bildspeicher zu, nicht auf die Dateidaten. Spätestens bei der Anzeige müssten doch im Speicher die Daten 1:1 vorliegen. *Grübel* Ich weiß es nicht wirklich, ist eher als Frage zu verstehen.

_________________
Salus populi suprema lex esto