2012-07-27 5 views
2

이미지의 크기를 알아 내고 싶다고 가정 해 봅시다. 사용자가 iPad 앱에서 10,000x1000 픽셀 이미지를로드하려고하면 대화 상자가 표시되고 충돌하지 않을 수 있습니다. 내 큰 이미지를 메모리에 즉시로드하는 [UIImage imageNamed:] 또는 [UIImage imageWithContentsOfFile:]을 수행하면 내가 대신 코어 이미지를 사용하는 경우코어 이미지가 이미지 데이터를 즉시로드합니까?

는 다음과 같이 말한다 :

CGSize imgSize = ciImage.extent.size; 

그 부하가 메모리에 전체 이미지가 저에게이 말할 것이다 :

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

그리고 그 크기에 대한 나의 새로운 CIImage 요청 , 또는 파일의 메타 데이터를보고 이미지의 크기를 알아낼 것인가?

답변

8

imageWithContentsOfURL 함수는 이미지를 메모리에로드합니다 (예).

다행히 Apple은 실제 픽셀 데이터를 iOS4의 메모리에로드하지 않고 이미지 메타 데이터를 읽도록 구현했습니다. in this blog post (편리하게 이미지 크기를 얻는 방법에 대한 코드 샘플을 제공합니다)을 읽는 방법을 읽을 수 있습니다.

편집 : 여기에 붙여 넣은 코드 샘플은 죽은 링크에 대한 보호 :

#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 참조가 also available here입니다.

+0

아, 음, CIImage는 내가 원하는 것을하지 않을 것이지만, 다른 것이 있다는 것을 알리라. 데이터를 더 다루기 쉬운 것으로 크기를 조정하는 방법을 알고 있다고 생각하지 않으므로 "거절"이라는 대화 상자가 아닌 사용자에게 내 거대한 이미지의 더 작은 버전을 제공 할 수 있습니까? –

+0

실제로, 나는 그것을 전에했다. 클래스에 [this post] (http://stackoverflow.com/a/2658801/465893)에 설명 된 메서드를 포함하거나 UIImage [like so] (https : //)에 카테고리로 메서드를 추가 할 수도 있습니다. gist.github.com/3185714) (접두사/헤더 클래스에 추가 할 수 있으며 모든 UIImage에서 사용할 수있는 방법입니다)! – andycam

+0

아하지만 그 방법은 UIImage가 메모리에 있음을 의미하는 크기 조정을 위해 제공되어야합니다. 그래서 크기를 조정하기 전에 엄청난 이미지로 UIImage를 처음 만들 때 응용 프로그램이 중단됩니다. –

관련 문제