NSImage agissant bizarre
-
25-09-2019 - |
Question
Pourquoi ce réglage du code artistImage à une image avec 0 largeur et hauteur 0?
* NSURL artistImageURL = [NSURL URLWithString: @ " http: // userserve -ak.last.fm/serve/252/8581581.jpg "];
NSImage * artistImage = [[NSImage alloc] initWithContentsOfURL: artistImageURL];
La solution
NSImage ne charge cette fin pour moi, mais cette image particulière a des métadonnées corrompues. Sa résolution selon les données exif est 7.1999997999228071e-06 dpi.
NSImage respecte l'info DPI dans le fichier, donc si vous essayez de dessiner l'image à sa taille naturelle, vous aurez quelque chose 2520000070 pixels à travers.
Autres conseils
Comme l'a écrit Ken, le DPI est foiré dans cette image. Si vous voulez forcer NSImage à définir la taille réelle de l'image (en ignorant le DPI), utilisez la méthode décrite à http://borkware.com/quickies/one?topic=NSImage :
NSBitmapImageRep *rep = [[image representations] objectAtIndex: 0];
NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];
Aux dernières nouvelles, NSImage's
-initWithContentsOfURL:
fonctionne uniquement avec les URL de fichiers. Vous aurez besoin de récupérer l'URL d'abord, puis utilisez -initWithData:
Il est plus ou moins garanti que .representations contient NSImageRep * (bien sûr pas toujours NSBitmapImageRep). Pour être sûr d'un côté pour les extensions futures, on peut écrire quelque chose comme le code ci-dessous. Et il prend également en compte la représentation multiple (comme dans certains .icns et .tiff).
@implementation NSImage (Extension)
- (void) makePixelSized {
NSSize max = NSZeroSize;
for (NSObject* o in self.representations) {
if ([o isKindOfClass: NSImageRep.class]) {
NSImageRep* r = (NSImageRep*)o;
if (r.pixelsWide != NSImageRepMatchesDevice && r.pixelsHigh != NSImageRepMatchesDevice) {
max.width = MAX(max.width, r.pixelsWide);
max.height = MAX(max.height, r.pixelsHigh);
}
}
}
if (max.width > 0 && max.height > 0) {
self.size = max;
}
}
@end