Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Bilder in .app Paketen

Bilder in .app Paketen

Moe99999
Moe9999931.05.0814:36
Hallo,

ich schreibe gerade ein kleines Programm für das ich über eine konstante relative Pfad Angabe Bilder laden muss.

Ich könnte natürlich die Bilder einfach in eine mitgelieferten Ordner kopieren und ins readme schreiben dass das Programm immer im selben Ordner wie der Ordner mit den Bildern seien muss..

Das ist aber sehr unschön. Gibt es vielleicht eine Möglichkeit das ich mit einer relativen pfadangabe auf die bilder zugreifen kann wenn ich sie mit in die .app Datei speichere?

Oder hat jemand eine andere Idee?
„42“
0

Kommentare

jogoto31.05.0815:30
Ist zwar überhaupt nicht mein Gebiet, aber es geht auf jeden Fall. Beispiel ein Bild im aktuellen Photoshop liegt in /Applications/Adobe Photoshop CS3/Adobe Photoshop CS3.app/Contents/Resources/Mascot.tif
0
jogoto31.05.0815:31
... zu schnell ...
... Relativ zur .app liegt es also in /Contents/Resources/Mascot.tif (Deine Pfadangabe).
0
jonny91
jonny9131.05.0817:00
Ich nehme mal an, dass es sich um ein Cocoa Programm handelt:

Du kopierst deine Bilder einfach in das Xcode Project und zwar in die Gruppe Resources. Das NSImage erstellst du dann so:

NSImage *myImage = [NSImage imageNamed:@"Dateiname.png"];

NSImage weiß dann wo es gucken muss. Wenn du den Pfad haben willst, gehst du so vor:

NSString *myPath = [[NSBundle mainBundle] pathForResource:@"Dateiname" ofType:@"png"];
„How much wood would a woodchuck chuck if a woodchuck could chuck wood?“
0
Moe99999
Moe9999931.05.0819:40
jogoto

wenn ich den Pfad so angebe findet er die Bilder leider nicht..


johnny91

nein, es handelt sich nicht um ein cobjC/cocoa Projekt sondern um ein kleines mit C++/SDL geschriebenes Spiel..



„42“
0
Arachnid
Arachnid01.06.0800:37
du kannst doch überg das erste argument (argv[0]) des Programmes kannst du doch den Pfad herausfinden und somit auch auch in dem .app Paket liegende Ressourcen ansprechen.
0
Moe99999
Moe9999905.06.0814:00
arachnid

stimmt.. da habe ich gar nicht dran gedacht..

geht aber trotzdem nicht, ich kann einfach nicht in das .app Packet eingreifen..
„42“
0
pstoehr05.06.0814:14
Hi Jungs,

versucht es doch mal mit:
[[NSBundle mainBundle] pathForImageResource:@"body"]]
Damit bekommt man den kompletten Pfad für ein Bild mit dem Namen "body" und der passenden Extension.
Mehr steht in der Doku.

Man liest sich
Peter
0
Arachnid
Arachnid05.06.0814:53
pstoehr
Hi Jungs,

versucht es doch mal mit:
[[NSBundle mainBundle] pathForImageResource:@&x22;body&x22;]]
Damit bekommt man den kompletten Pfad für ein Bild mit dem Namen &x22;body&x22; und der passenden Extension.
ER programmiert doch nicht in Obj.C Peter
nein, es handelt sich nicht um ein cobjC/cocoa Projekt sondern um ein kleines mit C++/SDL geschriebenes Spiel..

0
Moe99999
Moe9999905.06.0815:22
und schon stehe ich von dem nächsten Problem, hab gerade mal eben so von Debug auf Release gestellt und merke das nichts mehr richtig funktioniert (links so wie es bei Debug aussieht und rechts so wie es bei release aussieht )


„42“
0
Moe99999
Moe9999905.06.0815:24
meine Güte werden die Bilder hier stark komprimiert
„42“
0
Moe99999
Moe9999906.06.0819:16
So, hab die Zeile gefunden die Probleme gemacht hat.. jetzt funktioniert es wieder so wie es soll trotzdem komisch das die Fehler nur bei "Release" aufgetreten sind..
„42“
0
void
void06.06.0819:55
gleiches problem, nur in java^^

ich wette, dass das im inet sehr gut dokumentiert ist, aber wo der thread hier grade schonmal offen is... kann jmd spontan die lösung nennen? suchen kann ich selber, also nur antworten, wenn ihrs wisst und sonst nix zu tun habt

ich wrappe ne .jar in ne .app... am liebsten wär es mir, die ressource direkt in die jar zu schreiben (wg der platformunabhängigkeit)
„Developer of the Day 11. Februar 2013“
0
Moe99999
Moe9999912.06.0820:22
sehr seltsam, jetzt hab ich mal die .app datei umbenann und es nochmal mit einfachen ./name.app/bildname probiert und es funktioniert. Offensichtlich darf der name nur lettern aus dem englischen Alphabet beinhalten und auch kein < oder ähnliche Sonderzeichen.. jetzt muss ich aber verhindern das die app Datei so umbenannt wird dass sie ein unzulässiges Zeichen im namen hat.

Sieht inzwischen so aus:
„42“
0
osxnerd12.06.0821:09
Wenn Du mit relativen Pfaden arbeitest, ist es reiner Zufall, dass es klappt. Das kann sich je nach Aufrufumgebung ändern. Ebenso gibt es in Mac OS X keinerlei verbotenen Zeichen. Jedes Programm muss in allen verwendeten Pfaden den vollen Unicode-Zeichenvorrat (in UTF8-Codierung) unterstützen können.

Die einzig korrekte Art und Weise, das in C++ zu lösen, ist CoreFoundation zu verwenden. Du müsstest dann einen Aufruf nach folgendem Muster machen:

CFString *resourceURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("bildname"), CFSTR("jpg"));
CFString *path = CFURLCopyPath(resourceURL);

/* hier path verwenden */

if (path) CFRelease(path);
if (resourceURL) CFRelease(resourceURL);
0
Moe99999
Moe9999912.06.0821:27
natürlich liegt es nicht an os x..

Der bug liegt wohl bei SDL..
mir ist auch aufgefallen das SDL beim laden von Grafiken nicht zwischen groß und kleinschreibung unterscheidet

Core Foundation möchte ich nicht benutzen weil das Program ja auch auf linux und windows laufen soll..


Das es mit realtive Pfaden nur klappt wenn die Resource datei im selben verzeichnis bleibt wie beim kompilieren ist klar, deshalbbenutze ich ja auch absolute pfadangaben und solange niemand im app Packet rumpfuscht oder die app datei umbenennt funktioniert es ja auch..

ich glaub ich bastel mir aus argv[0] den beim start aktuellen namen der app datei susammen und gebe bei einem Zeichen das sdl nicht kennt eine entsprechende Fehlermedung aus..
„42“
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.