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関数は画像をメモリにロードします。はい。

幸いなことに、AppleCGImageSourceは、実際のピクセル データをメモリに読み込まずに画像メタデータを読み取るために iOS4 に実装しました。このブログ投稿でその使用方法を読むことができます(便利なことに、画像の寸法を取得する方法に関するコード サンプルが提供されています)。

編集:リンクの腐敗を防ぐために、ここにコードサンプルを貼り付けました:

#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 に答える