NSImage comporta in modo strano
-
25-09-2019 - |
Domanda
Perché questa impostazione di codice artistImage ad un'immagine con 0 larghezza e l'altezza 0?
* NSURL artistImageURL = [NSURL URLWithString: @ " http: // userserve -ak.last.fm/serve/252/8581581.jpg "];
NSImage * artistImage = [[NSImage alloc] initWithContentsOfURL: artistImageURL];
Soluzione
NSImage fa caricare questo bene per me, ma questo particolare immagine ha metadati corrotti. La risoluzione in base ai dati Exif è 7.1999997999228071e-06 dpi.
NSImage rispetta le informazioni DPI nel file, quindi se si tenta di disegnare l'immagine nelle sue dimensioni naturali, si otterrà qualcosa 2520000070 pixel in tutto.
Altri suggerimenti
Come ha scritto Ken, il DPI è incasinato in questa immagine. Se si vuole forzare NSImage per impostare la dimensione immagine reale (ignorando il DPI), utilizzare il metodo descritto in http://borkware.com/quickies/one?topic=NSImage :
NSBitmapImageRep *rep = [[image representations] objectAtIndex: 0];
NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];
Ultimo ho controllato, NSImage's
-initWithContentsOfURL:
funziona solo con gli URL dei file. Avrai bisogno di recuperare l'URL prima, e quindi utilizzare -initWithData:
E 'più o meno garantito che .representations contiene NSImageRep * (ovviamente non sempre NSBitmapImageRep). Per essere su un lato sicuro per future estensioni si può scrivere qualcosa di simile codice qui sotto. E si prende anche in considerazione la rappresentazione multipla (come in alcuni .icns e file 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