charger automatiquement une image

macvelottemacvelotte Membre
21:56 modifié dans API AppKit #1
Chapitre 13 de "Cocoa par la pratique" ...
Ayant défini un rectangle avec la souris, on charge une vue dans ce rectangle ;le code est :
        path = [openPanel filename];
        image = [[NSImage alloc] initWithContentsOfFile:path];
        [stretchView setImage:image];
Je voudrais charger automatiquement une image dans un rectangle prédéfini (je sais définir le rectangle).
Comment appeler "image.jpg" par exemple ?
«1

Réponses

  • 21:56 modifié #2
    À la place de [openPanel fileName], tu mets une NSString avec le chemin d'accès de ton image.
  • ChachaChacha Membre
    21:56 modifié #3
    Je pense à  une autre façon de comprendre la question : s'il s'agit simplement d'initialiser une vue de l'interface avec une image par défaut, on peut tout bêtement glisser la-dite image dans la vue en passant par Interface Builder.
  • macvelottemacvelotte Membre
    21:56 modifié #4
    Ben, rien ne marche ...
    Le glisser-déposer est refusé, et path=chemin d'accès est inopérant !

    En somme, je cherche à  charger ce qui sous les OS précédents était une ressource PICT.
  • ChachaChacha Membre
    21:56 modifié #5
    As-tu bien utilisé une NSImageView ?
  • 21:56 modifié #6
    Je dirais plutôt que le système de ressources n'est pas reconnu par Cocoa (enfin, juste un peu par NSFileManager). Tu ne sais pas mettre ton image dans un fichier bien standard?
  • mpergandmpergand Membre
    21:56 modifié #7
    Dans Xcode, tu ajoutes tes images à  ton projet par un clic-droit dans Group & Files et Add->Existing Files

    Dans IB, tu cliques sur l'onglet Images de la fenêtre de ton fichier nib et tu déposes l'image voulu sur le NSImageView.

    Sinon par programmation:
    <br />NSImageView* imageView;  //outlet<br /><br />-(void) awakeFromNib<br />  {<br /><br />  [imageView setImage:[NSImage imageNamed:@&quot;MonImage&quot;]];<br />  }<br />
    
  • macvelottemacvelotte Membre
    21:56 modifié #8
    Rien ne marche ...

    Il me faut encore relire les obscures documentations !!!

    Merci pour les réponses.

  • Eddy58Eddy58 Membre
    21:56 modifié #9
    Il faut convertir tes ressources PICT en format JPG, TIFF, BMP ou PNG et là  pas de problèmes...:)
  • macvelottemacvelotte Membre
    21:56 modifié #10
    Oui, bien sûr, mon image est au format .jpg (GraphicConverter est bien utile !)

    Mais je n'ai pas encore de solution : mais ça viendra ...
  • Eddy58Eddy58 Membre
    21:56 modifié #11
    Dans ce cas, il est curieux que ça ne fonctionne pas avec les réponses dans les posts ci-dessus...???
  • macvelottemacvelotte Membre
    21:56 modifié #12
    Oui, OK : NSimage View + un glisser-déposer de l'image ; c'était sans doute trop simple !!

    Mais je voudrais dessiner sur cette image (en l'occurence un planisphère sur lequel je veux mettr équateur, tropiques, cercles polaires etc ...

    Quelquechose m'intriqgue :
    - setLineWidth : c'est la dernière valeur qui s'impose ; comment faire ds traits de largeurs différentes ?

    [[NSColor xxxxColor] set] : il ne semble pas possible de faire des traits de couleurs différentes ???

    je change la couleur, mais c'est le premier choix qui prévaut ...

    Où est le truc ? :(
  • skensken Membre
    21:56 modifié #13
    dans 1108549172:

    Dans Xcode, tu ajoutes tes images à  ton projet par un clic-droit dans Group & Files et Add->Existing Files

    Dans IB, tu cliques sur l'onglet Images de la fenêtre de ton fichier nib et tu déposes l'image voulu sur le NSImageView.

    Sinon par programmation:
    <br />NSImageView* imageView;  //outlet<br /><br />-(void) awakeFromNib<br />  {<br /><br />  [imageView setImage:[NSImage imageNamed:@&quot;MonImage&quot;]];<br />  }<br />
    



    Bonsoir, j'ai suivi ce topic car il répond à  la question que je me posais aussi : je parviens à  charger une image dans un NSImageView, aussi bien par glisser-déposer que par programmation. Par contre, si je mets une sous-classe de NSImageView dans ma fenêtre, le glisser déposer ne marche plus et le code, je ne sais pas où le mettre : si je le mets dans la méthode drawRect j'ai un message "MyImageView may not respond to setImage". Or je préfère utiliser une sous classe de NSImageView, car j'ai besoin d'utiliser la méthode mouseDown.
    Où est l'erreur ??
    Merci de vos lumières
  • mpergandmpergand Membre
    février 2005 modifié #14

    Par contre, si je mets une sous-classe de NSImageView dans ma fenêtre, le glisser déposer ne marche plus et le code, je ne sais pas où le mettre : si je le mets dans la méthode drawRect j'ai un message "MyImageView may not respond to setImage"


    Vérifie que dans le fichier MyImageView.h tu as bien:
    @interface MyImageView : NSImageView

    car visiblement le compilo ne reconnaà®t pas ta classe comme dérivant de NSImageView. Vérifie aussi dans IB, que tu as bien sélectionné MyImageView dans le panneau info->Custom class
  • mpergandmpergand Membre
    février 2005 modifié #15

    [[NSColor xxxxColor] set] : il ne semble pas possible de faire des traits de couleurs différentes


    Donc, tu fixes ta couleur, tu dessines une ligne, tu fixes une autre couleur, tu dessines une ligne et ainsi de suite.

    Jette un ½il sur NSBezierPath  ;)
  • skensken Membre
    21:56 modifié #16
    Oui, les deux points que tu me signales sont bon, d'ailleurs la surcharge de la méthode mouseDown marche, ce qui je suppose signifie que le compilateur comprend qu'il a affaire à  une sous classe de NSImageView. Par contre je voudrais mettre une image dans cette image : avec ça : [self setImage: [NSImage imageNamed: @carte-afrique.gif]]; que j'ai placé dans la méthode drawRect ça ne marche pas : je n'ai pas de message d'erreur, mais l'image ne s'affiche pas. C'est probablement pas le bon code ou le bon endroit pour le mettre ?
  • mpergandmpergand Membre
    21:56 modifié #17

    Par contre je voudrais mettre une image dans cette image : avec ça : [self setImage: [NSImage imageNamed: @carte-afrique.gif]]; que j'ai placé dans la méthode drawRect


    Je comprends pas bien, tu veux dessiner une autre image par dessus celle affichée par ImageView ?
  • skensken Membre
    21:56 modifié #18
    Non, je me suis mal exprimée : j'ai créé une sous classe de NSImageView (MyImageView), j'ai mis dans ma fenêtre une custom view, ensuite j'ai choisi MyImageView dans les infos de custom class : dans la fenêtre de l'application j'ai donc un rectangle bleu avec écrit dessus MyImageView. Dans l'implémentation de MyImageView, j'ai mis la surcharge de mouseDown : ça marche. Par contre je n'arrive pas à  faire afficher une image dans le cadre de MyImageView.
  • mpergandmpergand Membre
    21:56 modifié #19

    j'ai mis dans ma fenêtre une custom view,


    Ok, j'ai pigé  :)

    Comme tu est parti d'un customView, le NSImageView est initialisé avec ces paramètres par défauts, donc pas d'image d'affiché et pas de cadre non plus. Donc il suffit de faire comme vu plus haut:

    <br />-(void) awakeFromNib<br />  {<br /><br />  [self setImage:[NSImage imageNamed:@&quot;MonImage&quot;]];<br />  }<br />
    


    Autre solution, dans IB tu pars d'un NSImageView et même chose, tu sélectionnes  MyImageView dans Custom Class et voilà Â  ::)
  • skensken Membre
    21:56 modifié #20
    Je dois zapper un truc... ça ne marche pas : je n'ai ni l'image ni son cadre. La méthode awakeFromNib il faut la mettre dans l'implémentation de MyImageView ou bien dans une autre class de type controlleur qu'il faudrait créer ?
  • mpergandmpergand Membre
    février 2005 modifié #21
    Petite explication sur awakeFromNib:

    Lors du chargement d'un nib, tous les objet contenus dans le nib sont créés, puis, la méthode awakeFromNib est appelée pour chacun de ces objets. Cela signifie que si un objet contient des outlets ceux-ci sont correctement initialisés lors de l'appel à  awakeFromNib, ce qui n'est pas le cas dans les méthodes initWithframe ou initWithCoder !

    Pour ton ImageView, tu ajoutes la méthode awakeFromNib dans MyImageView.m
  • skensken Membre
    21:56 modifié #22
    C'est bien ce que j'ai fait : awakeFromNib dans MyImageView.m. Donc je ne vois pas où j'ai fait l'erreur... La nuit porte conseil, j'arrête pour ce soir parce que ça m'énerve ! :brule:
    Merci en tous cas pour ta patience !
  • Eddy58Eddy58 Membre
    21:56 modifié #23
    Normalement ça doit y aller....Vérifies que tu as bien mis ton image dans la partie "Resources" de ton projet. :)
  • macvelottemacvelotte Membre
    21:56 modifié #24
    Je reprends ce que j'ai fait :
    Au départ, chapitre 13 de Cocoa par la pratique.
    Modification : j'ai placé une image en fond de fenêtre, par glisser déposer.
    Je veux dessiner des lignes sur cette image.
    Je place sur l'image une CustomView ; quelle doit être cette CustomView (StretchView,NSImageView ...) pour pouvoir dessiner des linges de couleurs différentes.
    Avec StrechView, ça ne marche pas : la couleur est fixe !!!
  • mpergandmpergand Membre
    21:56 modifié #25
    Je ne saurais te répondre concernant l'ouvrage que tu cites, n'ayant jamais ouvert un seul livre sur Cocoa  :)

    Cette exemple devrait te convenir:Introduction to Cocoa Graphics

    Maintenant, le plus simple serait que tu nous montres le code de ta classe customView.
  • macvelottemacvelotte Membre
    21:56 modifié #26
    Une question "bête" : comment inscrire du code dans un cadre bleu, avec le titre "Code" ?
  • cbrandtcbrandt Membre
    21:56 modifié #27
    clique sur l'icône # (au-dessus des simleys) puis mets le code entre les deux balises.
  • macvelottemacvelotte Membre
    21:56 modifié #28
    Voici le code :
    - (id)initWithFrame:(NSRect)rect<br />{<br />	NSPoint p0,p;<br />&nbsp; &nbsp; if (self = [super initWithFrame: rect]) <br />		{<br />&nbsp; &nbsp; &nbsp; &nbsp; path = [[NSBezierPath alloc] init];<br />&nbsp; &nbsp; &nbsp; &nbsp; [path setLineWidth: 0.5];<br />		[[NSColor redColor] set];<br />		p0.x=0;<br />		p0.y=180;<br />		[path moveToPoint:p0];<br />		p.x=800;<br />		p.y=p0.y;<br />		[path lineToPoint: p]; //trace l&#39;équateur<br />		<br />		[path setLineWidth: 0.3];<br />		[[NSColor orangeColor] set];<br />		p0.x=0;<br />		p0.y=226.8;<br />		[path moveToPoint:p0];<br />		p.x=800;<br />		p.y=p0.y;<br />		[path lineToPoint: p]; //trace le tropique du Capricorne (ou l&#39;autre, je ne sais plus ...)<br />		p0.x=0;<br />		p0.y=133.8;<br />		[path moveToPoint:p0];<br />		p.x=800;<br />		p.y=p0.y;<br />		[path lineToPoint: p]; // trace l&#39;autre tropique<br />		[[NSColor blueColor] set];<br />		p0.x=0;<br />		p0.y=46.9;<br />		[path moveToPoint:p0];<br />		p.x=800;<br />		p.y=p0.y;<br />		[path lineToPoint: p];// trace le cercle antarctique<br />		p0.x=0;<br />		p0.y=313.1;<br />		[path moveToPoint:p0];<br />		p.x=800;<br />		p.y=p0.y;<br />		[path lineToPoint: p];//trace le cercle arctique<br />		p0.x=400;<br />		p0.y=0;<br />		[path moveToPoint:p0];<br />		p.x=400;<br />		p.y=360;<br />		[[NSColor blueColor] set];<br />		[path lineToPoint: p];//trace le méridien de Greennwich, tous tracés sur fond planisphère<br />&nbsp; &nbsp; &nbsp; &nbsp; [path closePath];<br />		}<br />&nbsp; &nbsp; return self;<br />}<br />- (void)drawRect:(NSRect)rect<br />{<br />&nbsp; &nbsp; [[NSColor clearColor] set];<br />&nbsp; &nbsp; [NSBezierPath fillRect:[self bounds]];<br />&nbsp; &nbsp; [[NSColor greenColor] set];<br />&nbsp; &nbsp; [path stroke];<br />}<br /><br />- (void)dealloc<br />{<br />&nbsp; &nbsp; [path release];<br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br />@end
    


    Je ne fais pas de commentaire ...

  • fouffouf Membre
    21:56 modifié #29
    Juste un conseil pour ton code macvelotte, c'est pas terrible de mettre des nombres dans le nom d'une variable. Il est parfaitement possible que le probleme vienne de la.
  • macvelottemacvelotte Membre
    21:56 modifié #30
    OK, fouf, mais comment définir les coordonnées ???
  • fouffouf Membre
    21:56 modifié #31
    D'apres ton code, le point p0 est une sorte d'origine. Tu peux donc l'appeler origine, premierPoint (ou first point). Et pourquoi pas centreDeLaTerre  :o  ;)
Connectez-vous ou Inscrivez-vous pour répondre.