3

假设我想找出图像的大小,因此如果用户尝试在我的 iPad 应用程序中加载 10,000x10,000 像素的图像,我可以向他们显示一个对话框,而不会崩溃。如果我这样做,[UIImage imageNamed:]或者[UIImage imageWithContentsOfFile:]那会立即将我的潜在大图像加载到内存中。

如果我改用 Core Image,请这样说:

CIImage *ciImage = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:imgPath]];

然后问我新CIImage的尺寸:

CGSize imgSize = ciImage.extent.size;

这会将整个图像加载到内存中以告诉我这一点,还是仅查看文件的元数据以发现图像的大小?

4

1 回答 1

9

imageWithContentsOfURL函数将图像加载到内存中,是的。

幸运的是,Apple 在 iOS4 中实现了读取图像元数据而不将实际像素数据加载到内存中,您可以在这篇博CGImageSource文中了解如何使用它(方便地它提供了有关如何获取图像尺寸的代码示例)。

编辑:在此处粘贴代码示例以防止链接腐烂:

#import <ImageIO/ImageIO.h>

NSURL *imageFileURL = [NSURL fileURLWithPath:...];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)imageFileURL, NULL);
if (imageSource == NULL) {
    // Error loading image
    ...
    return;
}

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                     [NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options);
if (imageProperties) {
    NSNumber *width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
    NSNumber *height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
    NSLog(@"Image dimensions: %@ x %@ px", width, height);
    CFRelease(imageProperties);
}

完整的 API 参考也可在此处获得

于 2012-07-27T01:21:26.213 回答