NSImageView et Crénelage

Nebuchad34Nebuchad34 Membre
08:45 modifié dans API AppKit #1
Bonsoir, (et bonne année au passage :p )

J'ai ajouté à  mon interface un NSImageView éditable, en "binding" avec une NSImage. Le but étant simplement de pouvoir glisser déposer mon image dans le cadre NSImageView. Tout fonctionne parfaitement excepté que l'image, qui est rapetissée automatiquement pour s'ajuster à  la NSImageView est de fait crénelée et c'est vraiment très moche.

J'imagine qu'il y a moyen d'arranger ça en sous-classant le NSImageView mais je ne sais vraiment pas comment m'y prendre.

Merci d'avance pour votre aide.
;)

Réponses

  • Philippe49Philippe49 Membre
    08:45 modifié #2
    dans 1230838734:

    Tout fonctionne parfaitement excepté que l'image, qui est rapetissée automatiquement pour s'ajuster à  la NSImageView est de fait crénelée et c'est vraiment très moche.


    crénelée ?
    tu as mis quoi comme réglage IB pour "scaling" et "border"
  • Nebuchad34Nebuchad34 Membre
    08:45 modifié #3
    scaling "proportionnaly down" et border "none".
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #4
    J'ai du mal à  cibler ton problème.
    Essaie le projet ci-joint : vois-tu l'aspect crénelé à  l'utilisation ?
  • Nebuchad34Nebuchad34 Membre
    08:45 modifié #5
    Oui oui c'est bien ça, c'est tout moche.

    Voilà  ce que ça donne :

    3159912143_653e70f052.jpg

    Et ce quelque soit l'image source, il suffit quelle soit notablement plus grande que la taille du cadre
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #6
    Ben moi cela ne me fais pas cela
    Envoie ton image test pour essayer
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #8
    Tu peux essayer de faire un resize sur l'image :

    NSImage * thumbnail=[[NSImage alloc] initWithSize:newRect.size];

    // ouverture du port graphique de la petite image
    [thumbnail lockFocus];
    [NSGraphicsContext saveGraphicsState];
    // modif du port graphique
    [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
    [[NSGraphicsContext currentContext] setShouldAntialias:YES];

    // dessin de la grande image dans la petite
    [image drawInRect:newRect fromRect:oldRect operation:NSCompositeCopy fraction:1.0];

    // fermeture du port graphique de la petite image
    [NSGraphicsContext restoreGraphicsState];
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #9
    Peut-être que IKImageView serait plus performante ...


    Un tutoriel lié aux IKImageView

    [EDIT] Oui, bien mieux !
    (ne pas oublier d'inclure Quartz.framework)
  • Nebuchad34Nebuchad34 Membre
    08:45 modifié #10
    Le IKImageView ne m'arrange pas du tout (pas de fond transparent, pas de binding).

    Je ne comprends pas comment faire en sorte que l'image soit redimmensionné automatiquement comme tu l'as fait dans ton exemple avec le NSImageView. Tu peux m'envoyer la source ?

    Merci.
  • Philippe49Philippe49 Membre
    08:45 modifié #11
    Il n'y a pas besoin de binding pour IKImageView : cela s'utilise comme NSImageView, et cela supporte le drag and drop
    Tu peux essayer directement : tape IKImage dans le search field de IB, et mets importe le framework Quartz.framework dans ton projet (clic-droit sur le group frameworks, add Existing Framework et prendre dans Developper>SDKs>10.5>...)
    Pour le fond, il doit y avoir un réglage à  faire (voir la doc)


    Pour NSImage et le resize, il faudrait sous-classer NSImage et redéfinir setImage en faisant le resize à  l'intérieur.
    De plus il faudra peut-être regarder lors d'un redimensionnement de la fenêtre. Donc du code suppélmentaire qui doit être déjà  bien fait dans IKImageView.


  • Nebuchad34Nebuchad34 Membre
    08:45 modifié #12
    C'est bon, j'ai réussi à  faire ce qwue je voulait en sous-classant NSImageView.
    Merci pour ton aide.

    Pour ceux que ça interesserait, voilà  ma définition de la méthode "setImage:", sachant que mes RCImageView sont toutes carrées et de même taille, je renseigne la largeur en pix avec un #define LARGEUR_COTE

    - (void) setImage:(NSImage *)image<br />{<br />	NSImage * thumbnail=[[NSImage alloc] initWithSize:NSMakeSize(LARGEUR_COTE,LARGEUR_COTE)];<br />	<br />	[image setScalesWhenResized:YES];<br />	<br />	NSSize targetSize;<br />	<br />&nbsp; &nbsp; &nbsp; &nbsp; //définition de la taille de la miniature pour redimensionner proportionnellement<br />	if (image.size.width &gt; image.size.height)<br />	{<br />		 targetSize = NSMakeSize(LARGEUR_COTE, image.size.height*LARGEUR_COTE/image.size.width);<br />	} else {<br />		targetSize = NSMakeSize(image.size.width*LARGEUR_COTE/image.size.height, LARGEUR_COTE);<br />	}<br />	<br />	// ouverture du port graphique de la petite image<br />	[thumbnail lockFocus];<br />	[NSGraphicsContext saveGraphicsState];<br />	// modif du port graphique<br />	[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];<br />	[[NSGraphicsContext currentContext] setShouldAntialias:YES];<br />	<br />	// dessin de la grande image dans la petite<br />	[image drawInRect:NSMakeRect((LARGEUR_COTE - targetSize.width)/2,(LARGEUR_COTE - targetSize.height)/2,targetSize.width,targetSize.height) fromRect:NSMakeRect(0,0,image.size.width,image.size.height) operation:NSCompositeCopy fraction:1.0];<br />	<br />	// fermeture du port graphique de la petite image<br />	[NSGraphicsContext restoreGraphicsState];<br />	<br />	[super setImage:thumbnail];<br />}<br />
    

  • Philippe49Philippe49 Membre
    08:45 modifié #13
    Pour le fond "transparent" avec IKImageView, il suffit de mettre la couleur de la fenêtre dans le champ background de l'IKImageView.
  • Nebuchad34Nebuchad34 Membre
    08:45 modifié #14
    sauf qu'en l'occurence le fond de ma fenêtre est une image en dégradé qui s'attire en fonction de la taille de la fenêtre...
  • Nebuchad34Nebuchad34 Membre
    08:45 modifié #15
    De plus, ça m'arrange beaucoup de pouvoir réellement réduire la taille de l'image car elle est vouée à  être enregistré dans un fichier (mon application est une appli de document), et il est donc souhaitable de ne pas surcharger le poids du fichier à  cause d'une image dont on utilise jamais la pleine résolution.
Connectez-vous ou Inscrivez-vous pour répondre.