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];

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top