Affichage d'image

HommeCocoa

Membre actif
3 Janvier 2003
173
0
Vevey - Suisse
Bonjour à tous,

Je désire afficher une image contenue sur mon disque dans un NSImageView,

pour cela, j'ai écrit ceci:

NSImage *monImage;
monImage = [[NSImage alloc] initWithContentOfFile:@"/Users/nomdutilisateur/spitfire.jpg"];
[imageView setimage:monImage];


sachant qu'il y a biensur l'outlet imageView qui pointe sur le NSImageView

Cependant, rien ne s'affiche, j'imagine qu'il y a un problème dans le lien de fichier, pourtant c'est celui qui m'est donné, si je glisse l'image dans le terminal.

Merci d'avance
 
HommeCocoa a dit:
Bonjour à tous,

Je désire afficher une image contenue sur mon disque dans un NSImageView,

pour cela, j'ai écrit ceci:

NSImage *monImage;
monImage = [[NSImage alloc] initWithContentOfFile:@"/Users/nomdutilisateur/spitfire.jpg"];
[imageView setimage:monImage];


sachant qu'il y a biensur l'outlet imageView qui pointe sur le NSImageView

Cependant, rien ne s'affiche, j'imagine qu'il y a un problème dans le lien de fichier, pourtant c'est celui qui m'est donné, si je glisse l'image dans le terminal.

Merci d'avance


Verifie que dans la fenetre de log que tu n'ai pas de message d'erreur (toujours afficher la fenetre de log). La methode est initWithContentsOfFile et non initWithContentOfFile (il manque un "s")
Ensuite, verifie que monImage n'est pas à nil apres le chargement. Dans ce cas, c'est ton chemin qui doit être faux
 
  • J’aime
Réactions: molgow
voilà, j'ai rajouté le "s"

mais il y a effectivement une erreur dans le log, mais j'ai de la peine à l'interpreter:

[Session started at 2005-07-09 18:59:25 +0200.]
2005-07-09 18:59:27.779 DicoSon[1337] *** -[NSImageView setimage:]: selector not recognized [self = 0x36de00]
2005-07-09 18:59:27.779 DicoSon[1337] Exception raised during posting of notification. Ignored. exception: *** -[NSImageView setimage:]: selector not recognized [self = 0x36de00]


enfin d'après ce que j'ai compris, monImage n'a pas été créée... mais comment savoir si mon chemin est le bon? il faut lui donner un chemin absolu ou relatif? et si relatif, alors par rapport à quelle emplacement?

Merci encore
 
Tu n'as pas compris ;)
Il te faut apprendre l'anglais :D

Le message d'erreur te signale qu'il n'existe pas de méthode (selector) "setimage". Normal puisque c'est "setImage"... ;)

cf. documentation.
 
HommeCocoa a dit:
voilà, j'ai rajouté le "s"

mais il y a effectivement une erreur dans le log, mais j'ai de la peine à l'interpreter:

[Session started at 2005-07-09 18:59:25 +0200.]
2005-07-09 18:59:27.779 DicoSon[1337] *** -[NSImageView setimage:]: selector not recognized [self = 0x36de00]
2005-07-09 18:59:27.779 DicoSon[1337] Exception raised during posting of notification. Ignored. exception: *** -[NSImageView setimage:]: selector not recognized [self = 0x36de00]


enfin d'après ce que j'ai compris, monImage n'a pas été créée... mais comment savoir si mon chemin est le bon? il faut lui donner un chemin absolu ou relatif? et si relatif, alors par rapport à quelle emplacement?

Merci encore

C'est encore une erreur dans le nom de ma methode: c'est setImage avec un i majuscule.
Le message d'erreur est clair: "selector not recognized" sur [NSImageView setimage:]
 
Je rajouterais qu'également il faut regarder les warning de compilation. Encore plus en ObjC qu'en C++.
En ObjC si une méthode n'existe pas, il n'y a pas d'erreur de compilation. Seulement un warning.
En effet, l'appel d'une fonction envoi un message à l'instance de la classe qui lui appellera la méthode ad-hoc. C'est donc lors de l'exécution qu'il y aura un problème (d'où l'exception).
Mais le compilateur va tout de même indiquer un warning indiquant que la classe pourrait de pas répondre à la méthode.
 
apparement l'adressage est en absolu pour référencer les images, car j'ai du mettre ceci /Users/nomdutilisateur/spitfire.jpg

mais ceci est un peu problématique car si on diffuse l'application, le dossier de l'application ne sera pas forcement à la meme place chez tout le monde...

Peut-on rendre cet adressage relatif?

Merci encore
 
Ca va dépendre de la provenance de l'image.
Si c'est une image que tu fournis avec l'application, dans ce cas, le mieux est dans l'inclure dans ton projet (par exemple ne glissant l'image dans la partie "Ressources" du projet et en indiquant de copier le fichier).
Ensuite, si le NSImageView n'affiche que cette image, il est possible de le définir dans IB (l'image doit être listée dans l'onglet Images) en indiquant le nom de l'image dans le champs "Image:" du NSImageView.
Si par contre tu veux charger dynamiquement cette image dans ton programme, tu peux récupérer son chemin par le NSBundle (le bundle étant l'ensemble de l'application) :
NSString *imagePath = [[NSBundle mainBundle] pathForImageResource:@"image name"];
(le nom de l'image n'a pas d'extension)
 
En faite, je suis dans le deuxième cas, j'ai toute une liste d'image dans un répértoire DATA qui est dans le meme répértoire que mon projet et suivant les choix de l'utilisateur, l'une ou l'autre de ces images sera chargée.

Je dois donc récuperer les adresses à l'aide de NSBundle? même si ces images sont toujours à la même place d'un point de vue relatif à mon application?
 
si ton dossier ou se trouve tes images est dans ton projet, glisse le dans le groupe "Resources" dans XCode.
Decoche le "Copy..."
et selectionne "Recursively create..."
tu vas te retrouver dans xcode avec un groupe au nom de ton répertoire (DATA) dans le groupe resources.
Ensuite dans le soft, tu récuperes le chemin d'une image par
[[NSBundle mainBundle] pathForImageResource:@"image_name"];
Le mieux est de toujours appeler cette méthode, même si elles sont toujours au même endroit !
 
[[NSBundle mainBundle] pathForImageResource:@"image_name"];

ceci me retourne une NSString?

je peux marquer

NSString *maChaineM
maChaine = [[NSBundle mainBundle] pathForImageResource:@"image_name"];

pour avoir le path?
 
1/ regarder dans l'aide (qui est bien faites) ce que la fonction fait
2/ tester et afficher en faisant un NSLog(@"%@",maChaine) pour savoir ce que donne le resultat