2010-02-03 8 views

Répondre

1

NSImage charge cette amende 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 les informations DPI dans le fichier. Si vous essayez de dessiner l'image à sa taille naturelle, vous obtiendrez quelque chose comme 2520000070 pixels.

0

Aux dernières nouvelles, NSImage's-initWithContentsOfURL: fonctionne uniquement avec les URL de fichiers. Vous devez d'abord récupérer l'URL, puis utiliser -initWithData:

+2

A noter également qu'il est jamais une bonne idée d'utiliser l'un des '-initWithContentsOfURL:' méthodes du thread principal car ils bloquent la boucle d'événement principal. Utilisez un objet 'NSURLConnection' asynchrone pour créer un objet' NSData' et notifier à la place à la fin. –

+0

NSImage peut charger à partir du réseau. Oui sur le point de Rob, cependant. – Ken

4

Comme Ken l'a écrit, 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]; 
+1

Ce n'est pas sûr en général. C'est un cast dangereux pour NSBitmapImageRep. Par exemple, une image arbitraire peut être un fichier PDF sauvegardé, auquel cas pixelsWide et pixelsHigh retourneront NSImageRepMatchesDevice indiquant que le rep est indépendant de la résolution. NSImageRepMatchesDevice == 0. – Ken

+0

C'est bon à savoir ... mais pour les images web standard (png, gif, jpg) cela ne devrait pas arriver, non? –

+0

Non, il n'y a aucune promesse quant à quel type serait utilisé - c'est un casting de type purement dangereux. La principale raison pour laquelle cela changerait serait si NSBitmapImageRep était déprécié en faveur d'une nouvelle sous-classe rep qui correspondait mieux à CGImage. Ensuite, les personnes qui instanciaient explicitement NSBitmapImageRep l'obtiendraient pour compat, mais pas les personnes qui faisaient juste NSImages comme ça. – Ken

0

Il est plus ou moins garanti que .representations contient NSImageRep * (bien sûr pas toujours NSBitmapImageRep). Pour être sûr de futures extensions on peut écrire quelque chose comme le code ci-dessous. Et il prend également en compte la représentation multiple (comme dans certains fichiers .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