NSImage ведет себя странно
-
25-09-2019 - |
Вопрос
Почему этот код устанавливает для 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