NSImage ведет себя странно - PullRequest
       22

NSImage ведет себя странно

3 голосов
/ 03 февраля 2010

Почему этот код задает artistImage к изображению с шириной 0 и высотой 0?

NSURL * artistImageURL = [NSURL URLWithString: @ "http://userserve -ak.last.fm / serve / 252 / 8581581.jpg "];
NSImage * artistImage = [[NSImage alloc] initWithContentsOfURL: artistImageURL];

Ответы [ 4 ]

4 голосов
/ 20 июня 2010

Как писал Кен, в этом изображении портится DPI. Если вы хотите, чтобы NSImage устанавливал реальный размер изображения (игнорируя DPI), используйте метод, описанный в http://borkware.com/quickies/one?topic=NSImage:

NSBitmapImageRep *rep = [[image representations] objectAtIndex: 0];
NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];
1 голос
/ 21 апреля 2010

NSImage загружает это нормально для меня, но это конкретное изображение имеет поврежденные метаданные. Его разрешение по данным exif составляет 7.1999997999228071e-06 dpi.

NSImage учитывает информацию DPI в файле, поэтому, если вы попытаетесь нарисовать изображение в его естественном размере, вы получите что-то 2520000070 пикселей.

0 голосов
/ 29 августа 2013

Более или менее гарантировано, что .representations содержит NSImageRep * (конечно, не всегда NSBitmapImageRep). Чтобы быть в безопасности для будущих расширений, можно написать что-то вроде кода ниже. И это также учитывает множественное представление (как в некоторых файлах .icns и .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
0 голосов
/ 03 февраля 2010

В последний раз я проверял, NSImage's -initWithContentsOfURL: работает только с файловыми URL Сначала вам нужно получить URL, а затем использовать -initWithData:

...