NSImage表现得很奇怪

时间:2010-02-03 06:06:09

标签: objective-c cocoa image nsimage

为什么此代码将artistImage设置为0宽度和0高度的图像?

  

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

4 个答案:

答案 0 :(得分:4)

正如Ken所写,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 :(得分:1)

NSImage确实为我加载了这个,但该特定图像的元数据已损坏。根据exif数据的分辨率是7.1999997999228071e-06 dpi。

NSImage尊重文件中的DPI信息,因此如果您尝试以自然尺寸绘制图像,则会获得2520000070像素的光。

答案 2 :(得分:0)

我上次检查,NSImage's -initWithContentsOfURL:仅适用于文件网址。您需要先检索网址,然后使用-initWithData:

答案 3 :(得分:0)

或多或少保证.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