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
Gausi: 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
Narses: 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
Narses: 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!
Prophet- hat folgendes geschrieben : |
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
Narses: 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
Prophet- hat folgendes geschrieben : |
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.
Prophet- hat folgendes geschrieben : |
@ 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
Narses' letztem Beitrag nehmen, anstatt eine Antwort mit vier Wörtern abzuschicken :roll:
Narses hat folgendes geschrieben : |
[...] 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!