Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbwerte aus JPEG Bildern auslesen (https://www.delphipraxis.net/42057-farbwerte-aus-jpeg-bildern-auslesen.html)

ChinEnte 12. Mär 2005 19:45


Farbwerte aus JPEG Bildern auslesen
 
Servus,

Ein Freund und ich wollen hiermit um Hilfe bei folgender Angelegenheit ersuchen:

Wir wurden mit der Aufgabe betraut, JPEG-Bilder von einem Programm einlesen zu lassen und dann aus diesem automatisch die Farbwerte entnehmen zu lassen. Nun haben wir zwei Probleme:
  • Wie automatisieren wir das Einlesen von Bildern so, dass nur noch der Pfad angegeben werden muss?
  • Wie lesen wir aus JPEG-Bildern Pixel für Pixel die Farbwerte in Hexadezimal-Werten aus?

Mit der Hoffnung auf rasche Hilfe,
Andi und Philipp

Kiste 12. Mär 2005 20:19

Re: Farbwerte aus JPEG Bildern auslesen
 
Dann wollen wir mal :)

Also das mit den Dateien auslesen

Delphi-Quellcode:
function GetJPG(Verzeichnis:string):TStringList;
var SR     : TSearchRec;
  VerzList:TStringList;
begin
  if Verzeichnis[length(Verzeichnis)]<>'\' then
    Verzeichnis:=Verzeichnis+'\';
  if (FindFirst(Verzeichnis+'*.jpg',$3F,SR)=0) then begin
    repeat
      if (SR.Name<>'.') and (SR.Name<>'..') then
        VerzListe.Add(Verzeichnis+SR.Name);
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
  result:=VerzListe;
end;
Das sollte fürs erste mit den Verzeichnis funktionieren, denke ich.

Das mit den Pixels sollte so Funktionieren:
- Ihr lest die Datei in ein TImage ein.
- Dann bildet ihr 2 For-Schleifen mit i,j, die muessen so groß sein wie das Bild breit/groß ist.
- Dann muesst ihr nurnoch mit image1.canvas.pixels[i,j] das ding durchgehen
- Ihr erhaltet dann halt genuegend TColor werte, die ihr nurnoch abspeichern muesst

Denke das sollt helfen

mfg Kiste

ChinEnte 12. Mär 2005 22:08

Re: Farbwerte aus JPEG Bildern auslesen
 
Danke für die umgehende Hilfe. Das Einlesen der Bilder läuft wie am Schnürchen. Gibt es eine Funktion in Delphi, mit der man wie bei einer Standartinstallation die Dateien manuell ohne Angabe des Pfades auswählen kann? Du weisst schon, auf Button drücken und rumklicken, Windoof2k rulez. Wir legen ja Wert auf Benutzerfreundlichkeit. :stupid:

Kiste 12. Mär 2005 22:18

Re: Farbwerte aus JPEG Bildern auslesen
 
Du meinst TOpenDialog und TSaveDialog? Findeste im Karteireiter "Dialoge"

gut Nacht ;) Die Cebit ruft morgen

mfg Kiste

ChinEnte 12. Mär 2005 22:54

Re: Farbwerte aus JPEG Bildern auslesen
 
Code:
procedure TForm1.Button2Click(Sender: TObject);
var               //Hier wird das Bild in Image1 eingelesen
  Jpeg: TJpegImage;
  FBitmap:TBitmap;
begin
  Jpeg := TJpegImage.Create;
  try
    Jpeg.LoadFromFile(edit1.text);
    FBitmap := TBitmap.Create;
    FBitmap.Assign(Jpeg);
    Image1.Picture.Bitmap := FBitmap;
  finally
    Jpeg.Free;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var farben:array of integer;
    i,j,k:integer;
begin             //Hier werden die Farbwerte ausgelesen
for i:= 1to 760 do begin
  for j:= 1to 578 do begin
  k:=k+1;
  farben[k]:=image1.canvas.pixels[i,j]

  end;
end;
end;
Haben diesen Code jetzt geschrieben und alles klappt einwandfrei bis zu "farben[k]:=image1.canvas.pixels[i,j]"
da kommt dann die Fehlermeldung "can only modify Image if it contains a bitmap" aber wir wollen die ja nicht modifizieren, sondern lediglich die Farbwerte auslesen. Zumal:
Oberhalb wurde ja bitmap bereits in Bezug gebracht zu Image1 und alles lief. Auch führt das Umwandeln des Bildes zu einer Bitmap lediglich zu einer anderen Fehlermeldung.

EDIT:

Also, wir haben jetzt noch diesen Codeteil hier hinzugefügt:
Code:
procedure TForm1.FormCreate(Sender: TObject);

  VAR Bitmap : TBitmap;
begin
  Bitmap := TBitmap.Create;
  Bitmap.Width := 760;
  Bitmap.Height := 578;
  Image1.Picture.Graphic := Bitmap;
end;
und erhalten nun immer diesen Fehler:

'Access violation at address 0046548C in module 'Project1.exe'. Write of address 010AB424.'

@Kiste:
Haben das mit dem TOpenDialog gefunden und wollten es gleich mal zum Test bringen, aber wenn ich des in mein Formblatt einfüge und das Programm starte erscheint das Teil nicht auf dem ausgeführten Programm...

Khabarakh 12. Mär 2005 23:55

Re: Farbwerte aus JPEG Bildern auslesen
 
Code:
procedure TForm1.Button1Click(Sender: TObject);
var farben:array of integer;
    i,j,k:integer;
begin             //Hier werden die Farbwerte ausgelesen
for i:= 1to 760 do begin
  for j:= 1to 578 do begin
  k:=k+1;
  farben[k]:=image1.canvas.pixels[i,j]

  end;
end;
end;
Die Dimensionen des Arrays müssen erst mit Delphi-Referenz durchsuchenSetLength festgelegt werden. Außerdem sollte es wohl
Delphi-Quellcode:
for i := 0 to 759 do begin
  for j := 0 to 577 do begin
heißen.
Warum arbeitet ihr nicht gleich mit dem eingelesenen Bitmap? Das wäre die beste Lösung.
Zitat:

@Kiste:
Haben das mit dem TOpenDialog gefunden und wollten es gleich mal zum Test bringen, aber wenn ich des in mein Formblatt einfüge und das Programm starte erscheint das Teil nicht auf dem ausgeführten Programm...
Zum Ausführen musst du Delphi-Referenz durchsuchenExecute benutzen. Siehe auch die OH zu TOpenDialog.

Binärbaum 13. Mär 2005 01:59

Re: Farbwerte aus JPEG Bildern auslesen
 
Mir ist aufgefallen, dass du bei solchen Prozeduren
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Jpeg: TJpegImage;
    FBitmap:TBitmap;
begin
  Jpeg := TJpegImage.Create;
  try
    Jpeg.LoadFromFile(edit1.text);
    FBitmap := TBitmap.Create;
    FBitmap.Assign(Jpeg);
    Image1.Picture.Bitmap := FBitmap;
  finally
    Jpeg.Free;
  end;
end;
das FBitmap am Ende nicht mehr mit FBitmap.Free freigibst. Das ist doch sicher nicht so gewollt, oder?

MfG
Binärbaum

Harald 13. Mär 2005 07:35

Re: Farbwerte aus JPEG Bildern auslesen
 
Hallo,

für mich liest sich das so, als ob Ihr das Bild nach

"Image1.Picture.Bitmap := FBitmap;"

noch gar nicht zur Verfügung habt. Daher die Fehlermeldung

"can only modify Image if it contains a bitmap"

Das Programm sieht nur, dass kein Bild da ist - was damit passieren soll, das weiß es nun doch noch nicht ...

Habt Ihr mal geprüft, ob das Bild wirklich übernommen wurde?

Gruß
Harald

ChinEnte 13. Mär 2005 11:46

Re: Farbwerte aus JPEG Bildern auslesen
 
Zitat:

Zitat von Khabarakh
Die Dimensionen des Arrays müssen erst mit Delphi-Referenz durchsuchenSetLength festgelegt werden. Außerdem sollte es wohl
Delphi-Quellcode:
for i := 0 to 759 do begin
  for j := 0 to 577 do begin
heißen.
Warum arbeitet ihr nicht gleich mit dem eingelesenen Bitmap? Das wäre die beste Lösung.

Wir haben im der Hilfe von Delphi nach setlength gesucht aber nur sachen für dynamische Arrays gefunden. Wir wollen aber nur eine simple Array mit 439280 Positionen :D

Wenn wir die For-Schleife mit i:= 0 to 759 deklarieren würde es doch den letzten pixel auslassen und es gibt doch keinen Pixel 0 oder?
Deswegen 1 to 760 damit jeder Pixel ausgelesen werden kann... oder? :wall:
Aber auf jeden mal vielen Dank für die schnelle Hilfe

Airblader 13. Mär 2005 11:49

Re: Farbwerte aus JPEG Bildern auslesen
 
Delphi beginnt oft mit einer 0 und nur manchmal mit einer 1 ;)

air


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz