2010-05-07 7 views
10

그래서 나는 당신이있는 UIImage를 사용하여 파일에서 CGImage를 얻을 수 있습니다 알고 ...파일에서 CGImageRef를 얻으려면 어떻게해야합니까?

UIImage *img = [UIImage imageNamed:@"name.bmp"]; 
[img CGImage]; 

그러나하는 UIImage를 사용하지 않고 CGImageRef을 얻을 수있는 방법이 있나요?

(UIKit에 액세스 할 수없는 정적 라이브러리에서이 작업을 시도하고 있습니다.) 필요한 경우 다른 프레임 워크를 사용할 수 있으며 UIKit는 사용할 수 없습니다. CIImage이 효과가 있습니까? 또는 NSBitmapImageRep?

+0

ImageIO.framework를 사용할 수 있지만 그렇지 않으면 순수 CG 기능으로 BMP를 읽을 수 없습니다. – kennytm

+0

호기심에서 벗어나 UIImage에서 이미지를로드하는 데 어떤 해가됩니까? 상당한 메모리 차이가 있습니까? – MrHen

+0

단위 테스트에서이 작업을 수행하고 있습니다. 우리가 작성중인 정적 라이브러리는 CGImageRef를 사용합니다. 내가 가지고있는 테스트 파일에서 하나를 전달하여 테스트하고 싶다. 내 단위 테스트 프로젝트에서 UIKit로드 및 UIImage 길을 시도했지만 결코 작동하지 않습니다. 내 단위 테스트 프로젝트가보기 응용 프로그램이 아니기 때문에 가정합니다. –

답변

18

당신을 NSData에서 그것을 얻을 수 있습니다

CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((CFDataRef)[NSData dataWithContentsOfFile:@""]); 
CGImageRef image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); // Or JPEGDataProvider 

당신은 데이터가 작동이에 대한 JPEG 또는 PNG 것을 확신해야합니다.

+0

달콤한! 감사! BMP를 위해이 작업을 수행 할 수있는 방법이 있는지 알고 있습니까? CGImageCreateWithBMPDataProvider가 없습니다 ... –

+0

아니요, 죄송합니다, UIImage 경로를 따라 가야 할 것 같습니다 : ( –

+0

이것은 정말 도움이되었지만 알아야 할 점은 ' CGImageRef'를 다음의'CGImageRelease (image); – taymless

1

당신은 [UIImage imageNamed : @ "name.bmp"]를 사용하는 것이 UIKit 프레임 워크를 통해 작동한다는 것을 알아야합니다. 이것은 스레드로부터 안전하지 않습니다. dispatch_apply 예제는 Quartz 프레임 워크를 사용해야한다.

// Through Quartz 
NSString *maskFilePath = [[NSBundle mainBundle] pathForResource:@"mask" ofType:@"png"]; 
CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([maskFilePath UTF8String]); 
CGImageRef maskRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); 
관련 문제