Entwickler-Ecke

Multimedia / Grafik - Bilddatei in Array einlesen


Prophet- - Di 26.05.09 14:59
Titel: Bilddatei in Array einlesen
Hi liebe Community,

ich will für ein kleines Delphi Projekt mehrere Bilder in ein Array einlesen, das geht ja durch den Befehl .loadfromfile('Dateipfad'). Nun will ich aber nicht den genauen Dateipfad angeben, denn ich will ja das Projekt auf meinem USB-Stick speichern, damit ichs überall mitnehmen kann. Die Bilder liegen dann im selben Ordner wie das Projekt nur dort im Ordner GFX, leider hab ich vergessen, was ich eintippen muss, dass er auf den Ordner GFX zugreift. Könnt ihr mir helfen?

Vielen Dank im vorraus
Prophet-


Moderiert von user profile iconGausi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 26.05.2009 um 15:33


Gausi - Di 26.05.09 15:03

Den Dateinamen der Exe-Datei bekommst du mit ParamStr(0), den Ordner erhältst du daraus mit ExtractFilePath.


Delete - Di 26.05.09 15:03

Den Pfad zum eigenen Programm bekommst Du mit

Delphi-Quelltext
1:
ExtractFilePath(ParamStr(0))                    


ffgorcky - Di 26.05.09 15:14

Ich weiß jetzt nur leider im Moment nicht, ob Du dann dort nicht noch hinten ein solches Zeichen (Nur das in den Hochkommas"\") hinten anfügen musst, bevor Du den Namen Deiner zu ladenen Datei hinschreiben kannst.
Also würde ich (um das herauszufinden) mir dann erst mal das so anzeigen lassen:

Delphi-Quelltext
1:
MessageBox(ExtractFilePath(ParamStr(0),'Pfadangabe',MB_OK)                    


Delete - Di 26.05.09 15:16

Oder einmal einen Blick in die Hilfe werfen, da steht nämlich, dass der Backslash am Ende enthalten ist ;)


Prophet- - Di 26.05.09 15:19

Wie mach ich das nun, dass das Bild mit dem Namen 'Spielfeld.jpg' in mein Bildarray[1] eingelesen wird?

Moderiert von user profile iconNarses: 2. Frage entfernt.


Delete - Di 26.05.09 15:21

Mit LoadFromFile, hast Du doch selbst geschrieben. Wo hakt es denn?


Prophet- - Di 26.05.09 15:24


Delphi-Quelltext
1:
Image1.Picture.LoadFromFile(ExtractFilePath + '\gfx\Spielfeld.jpg');                    

Das iss ja klar, nur will ich das Bild ja nicht in ein Image1 speichern, sondern in mein Bildarray[1].
€dit: Bildarray ist vom Typ TBitmap

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Gausi - Di 26.05.09 15:29

Nimm eine Hilfsvariable vom Typ JPegImage aus der Unit Jpeg, erzeuge sie, lade die Jpeg-Datei da rein, und setze dann per Assig das Bitmap:
Ganz grob also so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
uses ... Jpeg ...
//...
jpg := TJpegImage.Create;
try
  jpg.LoadFromFile(Filename);
  BildArray[1].Assign(jpg);
finally
  jpg.free;
end;


Narses - Di 26.05.09 16:07

Moin!

Bei Gausis Ansatz würde ich BildArray: array of TBitmap; annehmen. ;)

Denkbar wäre aber auch BildArray: array of TJpegImage;, dann könnte man direkt da rein laden. :idea:

cu
Narses


Prophet- - Di 26.05.09 16:15

Also einfach?

Delphi-Quelltext
1:
2:
jpg := TJpegImage.Create;
bildarray[1]:=jpg.loadfromfile(filename);


Narses - Di 26.05.09 16:27

Moin!

user profile iconProphet- hat folgendes geschrieben Zum zitierten Posting springen:
Also einfach?

Delphi-Quelltext
1:
2:
jpg := TJpegImage.Create;
bildarray[1]:=jpg.loadfromfile(filename);
Nein, das funktioniert doch gar nicht. :? Hast du die Beiträge und Tipps wirklich gelesen? :gruebel:

cu
Narses


Prophet- - Di 26.05.09 16:47

Lösung:

Delphi-Quelltext
1:
2:
bildarray[1] := tbitmap.Create;
bildarray[1].LoadFromFile(ExtractFileDir(ParamStr(0))+ '\gfx\Pacman.bmp');


@ Narses: Nein ich lese mir die Beiträge nie durch ist zu 99,99% eh schrott, ich frag nur lieber die ganze Zeit dumme Fragen[/ironie]

EDIT:

Nächstes Problem:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
for k:=1 to 8 do
    begin
    bildarray[k] := tbitmap.Create;
    end;

bildarray[1].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Pacman.bmp');
bildarray[2].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Mauer.bmp');
bildarray[3].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Punkt.bmp');
bildarray[4].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Schwarzes Feld.bmp');
bildarray[5].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist gelb.bmp');
bildarray[6].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist rot.bmp');
bildarray[7].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist lila.bmp');
bildarray[8].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist blau.bmp');


Dabei wird folgende Fehlermeldung angezeigt:
Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.


Narses - Di 26.05.09 17:35

Moin!

In welcher Zeile tritt der Fehler auf? Das Bild existiert (Tiepvehler beim Namen?) und ist ein korrektes Bitmap (mal testweise in der IDE das Bild in ein TImage auf dem Formular laden)?

cu
Narses


Prophet- - Di 26.05.09 17:56

Die erste Zeile funktioniert, die anderen alle nicht.


Delete - Di 26.05.09 18:11

Und das sind auch ganz sicher alles Bitmaps und nicht bloß umbenannte JPEGs oder sowas?


Prophet- - Di 26.05.09 18:16

Das sind 100%ige BMP'S


Yogu - Di 26.05.09 18:17

user profile iconProphet- hat folgendes geschrieben Zum zitierten Posting springen:
Lösung:

Delphi-Quelltext
1:
2:
bildarray[1] := tbitmap.Create;
bildarray[1].LoadFromFile(ExtractFileDir(ParamStr(0))+ '\gfx\Pacman.bmp');

Wie kommst du denn plötzlich auf ExtractFileDir? Das ist irgendwas veraltetes. Was du brauchst, ist ExtractFilePath. Da ist dann auch der Backslash dabei, dann musst du den in den Informationen zum Pfad natürlich weglassen.

Außerdem könntest du noch probieren, ob die Dateien wirklich existieren (und ob die Pfadangaben so stimmen!). Verwende dazu


Delphi-Quelltext
1:
FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\Pacman.bmp')                    

um wirklich sicher sein zu können.

user profile iconProphet- hat folgendes geschrieben Zum zitierten Posting springen:
@ Narses: Nein ich lese mir die Beiträge nie durch ist zu 99,99% eh schrott, ich frag nur lieber die ganze Zeit dumme Fragen[/ironie]

Leider könnten das einige hier auch ohne Ironie von sich behaupten :(

Und du könntest ruhig auch mal Stellung zu user profile iconNarses' letztem Beitrag nehmen, anstatt eine Antwort mit vier Wörtern abzuschicken :roll:

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
[...] mal testweise in der IDE das Bild in ein TImage auf dem Formular laden


Delete - Di 26.05.09 18:38

Delphi 2007-Hilfe hat folgendes geschrieben:
Beschreibung
ExtractFileDir gibt einen String zurück, der als Parameter an die Funktionen CreateDir, GetCurrentDir, RemoveDir und SetCurrentDir übergeben werden kann. Enthält FileName keine Laufwerks- und Verzeichnisangabe, wird ein leerer String zurückgegeben.

Anmerkung: Diese Funktion arbeitet mit Multibyte-Zeichensätzen (MBCS).

Das Wort "veraltet" kann ich da nirgends entdecken. Nichtsdestotrotz würde ich auch ExtractFilePath verwenden wie bereits oben geschrieben.


Prophet- - Mi 27.05.09 18:00

So habe jetzt gecheckt ob die alle vorhanden sind mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\Pacman.bmp')    and
   FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\mauer.bmp')        and
   FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\Punkt.bmp')        and
   FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\SchwarzesFeld.bmp')  and
   FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\Geist rot.bmp')     and
   FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\Geist gelb.bmp')   and
   FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\Geist lila.bmp')    and
   FileExists(ExtractFileDir(ParamStr(0))+ '\gfx\Geist blau.bmp')
then showmessage('hi')
else showmessage('error');


Ging alles. Der Fehler muss irgendwo anders sitzen.

€: Hab wie Narses gesagt hat alle überpfrüft, sind alle gültige Bitmaps.


Delete - Mi 27.05.09 18:04

Wie ist denn das Array definiert?


Prophet- - Mi 27.05.09 19:48

Problem gelöst.


Delete - Mi 27.05.09 19:57

Und jetzt lässt Du uns dumm sterben? Was war es denn?


Prophet- - Do 28.05.09 18:10

Wie? Ich lass euch dumm sterben??


jaenicke - Do 28.05.09 18:20

Er meinte damit, dass es ganz sinnvoll ist, wenn du hier auch schreibst woran es lag. Denn wenn später jemand diesen Thread liest, dann könnte dem ja die Lösung helfen. ;-)


ffgorcky - Do 28.05.09 19:10

Also ich denke ja, dass ein Array immer bei 0 (=Null) anfängt.
Also würde ich das so schreiben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
for i:=0 to 7 do
    bildarray[i] := tbitmap.Create;
bildarray[0].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Pacman.bmp');
bildarray[1].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Mauer.bmp');
bildarray[2].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Punkt.bmp');
bildarray[3].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Schwarzes Feld.bmp');
bildarray[4].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist gelb.bmp');
bildarray[5].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist rot.bmp');
bildarray[6].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist lila.bmp');
bildarray[7].LoadFromFile(ExtractFileDir(ParamStr(0)) + '\GFX\Geist blau.bmp');


Delete - Do 28.05.09 19:12

Das gilt nur für dynamische Arrays, ein statisches beginnt mit dem Index, den Du selber definiert hast.


jaenicke - Do 28.05.09 19:18

Deshalb ist es auch am besten Schleifen immer von Low bis High des Arrays laufen zu lassen, dann ist das vollkommen egal.

Auch hätte ich hier die Dateinamen in ein konstantes Array geschrieben statt das so zu schreiben.


Delete - Do 28.05.09 19:18

Das predige ich ja auch immer, aber auf mich hört ja eh keiner.