Icônes, Images, représentations d'images, ...
Antilog
Membre
Salut,
J'ai des problèmes avec les NSImage (ou NSImageRep)...
Voilà , je récupère l'image d'une icône standard de dossier:
J'obtiens une image avec 3 NSImageRep (4 avec Leopard), de tailles 16x16, 32x32, 128x128; par contre, à l'affichage, il sélectionne par défaut 32x32.
Si je fais un
par contre, l'image 128x128 est bien affichée
Question N° 1: Puisque l'affichage ne semble pas sélectionner la représentation la plus appropriée de l'image dans ce cas (tous les autres paramètres des différents imageReps sont identiques), est-ce qu'ils ne sont pas inutiles ici? Ca veut dire que je ne pourrais pas profiter du dessin de l'image optimisée à la taille de mon imageView?
Je voudrais en fait badger cette image: j'utilise le code suivant:
Ca ne fonctionne pas, le rectangle n'apparaà®t pas; par contre, si je fais:
Le rectangle apparaà®t bien!!! (mais sans l'image, bien sûr) Comment est-ce possible? Je dois faire une erreur idiote, mais je ne vois vraiment pas...
Question subsidiaire: si je badge l'icône, sur quelle représentation ça s'applique? celle qui est "sélectionnée" par le setSize? Celle que le système a choisi par défaut (32x32)? Toutes?
Je nage un peu, j'avoue
J'ai des problèmes avec les NSImage (ou NSImageRep)...
Voilà , je récupère l'image d'une icône standard de dossier:
NSImage * folderImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)] retain];<br /> [myImageView setImage:folderImage];<br />
J'obtiens une image avec 3 NSImageRep (4 avec Leopard), de tailles 16x16, 32x32, 128x128; par contre, à l'affichage, il sélectionne par défaut 32x32.
Si je fais un
[folderImage setSize:NSMakeSize(128.0, 128.0)];<br />
par contre, l'image 128x128 est bien affichée
Question N° 1: Puisque l'affichage ne semble pas sélectionner la représentation la plus appropriée de l'image dans ce cas (tous les autres paramètres des différents imageReps sont identiques), est-ce qu'ils ne sont pas inutiles ici? Ca veut dire que je ne pourrais pas profiter du dessin de l'image optimisée à la taille de mon imageView?
Je voudrais en fait badger cette image: j'utilise le code suivant:
NSImage * folderImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)] retain];<br /> [folderImage setSize:NSMakeSize(128.0, 128.0)];<br /> [folderImage lockFocus];<br /> NSBezierPath *bp = [NSBezierPath bezierPathWithRect:NSMakeRect(0,0,32,32)];<br /> [[NSColor blackColor] set];<br /> [bp fill];<br /> [folderImage unlockFocus];<br /> [myImageView setImage:folderImage];<br />
Ca ne fonctionne pas, le rectangle n'apparaà®t pas; par contre, si je fais:
NSImage * folderImage = [[NSImage alloc] initWithSize:NSMakeSize(128.0, 128.0)];<br /> [folderImage lockFocus];<br /> NSBezierPath *bp = [NSBezierPath bezierPathWithRect:NSMakeRect(0,0,32,32)];<br /> [[NSColor blackColor] set];<br /> [bp fill];<br /> [folderImage unlockFocus];<br /> [myImageView setImage:folderImage];<br />
Le rectangle apparaà®t bien!!! (mais sans l'image, bien sûr) Comment est-ce possible? Je dois faire une erreur idiote, mais je ne vois vraiment pas...
Question subsidiaire: si je badge l'icône, sur quelle représentation ça s'applique? celle qui est "sélectionnée" par le setSize? Celle que le système a choisi par défaut (32x32)? Toutes?
Je nage un peu, j'avoue
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais il me semble que ça pose plein de problèmes, certaines représentations ne veulent pas qu'on dessine dessus.
[size=5pt][edit] bouh, la faute d'orthographe[/size]
J'ai essayé d'utiliser lockFocusOnRepresentation (même sur toutes les représentations de l'image) sans résultat, mon "badge" n'apparaà®t toujours pas.
Fou de rage, j'ai supprimé toutes les représentations sauf celle à 128x128 avec:
même (absence de) résultat.
En fait, pour y parvenir, j'ai dû créer une autre image comme ceci:
Cette fois-ci, l'affichage de newFolderImage dans mon imageView est correcte.
La seule explication que je vois, c'est comme tu dis que la représentation du départ n'accepte pas que l'on gribouille par dessus le beau dessin d'Apple.
L'image originale est comme ceci:
[tt] po folderImage
NSImage 0x3563f0 Size={512, 512} Reps=(
NSBitmapImageRep 0x357a10 Size={128, 128} ColorSpace=NSDeviceRGBColorSpace BPS=8 BPP=32 Pixels=128x128 Alpha=YES Planar=NO Format=0,
NSBitmapImageRep 0x357de0 Size={32, 32} ColorSpace=NSDeviceRGBColorSpace BPS=8 BPP=32 Pixels=32x32 Alpha=YES Planar=NO Format=0,
NSBitmapImageRep 0x358180 Size={16, 16} ColorSpace=NSDeviceRGBColorSpace BPS=8 BPP=32 Pixels=16x16 Alpha=YES Planar=NO Format=0
)
[/tt]
l'image finale qui s'affiche correctement est comme cela:
[tt]po newFolderImage
NSImage 0x357850 Size={128, 128} Reps=(
NSCachedImageRep 0x356410 Size={128, 128} ColorSpace=NSCalibratedRGBColorSpace BPS=8 Pixels=128x128 Alpha=YES
)
[/tt]
j'écrivais la réponse pendant que tu postais, en effet, en redessinant l'icône, puis le badge, ça fonctionne!
Mais ça ne m'aide pas vraiment à comprendre
J'avais eu le problème et trouvé une solution, mais je ne sais plus où c'est et si c'est ici ou sur Macbidouille. :-\\
Schlum a raison, modifier une image ne fait que modifier son NSCachedImageRep, sorte de cache d'image bitmap utilisé par Cocoa pour accélérer l'affichage.
Lorsque que tu charges l'image, mais qu'elle n'a pas encore été manipulée graphiquement (cà d affichée), il est possible que le cache soit vide ou n'existe pas encore.
Ce qui explique pourquoi quand tu dessines dedans, seul le bezierPath apparait, si le cache est utilisé à ce moment pour l'affichage (ce qui n'est pas garanti puisque le système peut utiliser une autre représentation, et donc détruire le cache avec ton bezier pour créer le nouveau).
Le mélange d'image (ce que tu fais en voulant dessiner sur une image existante) doit se faire comme Fouf le dit : par l'intermédiaire d'une nouvelle image. Cela est aussi écrit dans la doc.
Pas garanti que ça fonctionne, mais c'est une piste !
@schlum: Dans mon cas, ça ne donne rien de plus.
Je vais donc m'en tenir à ce que me disent Fouf et No (et merci de l'explication, No), et donc recréer une nouvelle image et ré-écrire dedans!
Schlum, ce code est surtout utile pour 2 raisons :
- lorsqu'aucun contexte graphique n'est ouvert,
- si les caractéristiques de l'image divergent de celles du contexte courant (par exemple modification du ppp, qui par défaut est celui de l'écran, soit 72).
Mais je ne vois pas en quoi il pourrait permettre de modifier une imageRep déjà existante (et non cachée).
Ceci fonctionne par contre :
Pour génèrer la NSCachedImageRep dès le chargement de l'image, sans avoir besoin de l'afficher dans une vue, il suffit de faire:
C'est 100 % efficace (et c'était même noté dans un coin obscur de la doc Apple...)