Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

NSBitmapImageRep *rep = [[image representations] objectAtIndex: 0];
NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];

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

Это более или менее гарантировано, что .reesentations содержит 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top