2010-08-21 5 views
5

CGContextDrawImage 호출에서 EXEC_BAD_ACCESS 오류가 발생하여 다시 추적하려고합니다. PNG 이미지가 있고 UIImagePNGRepresentation o NSData 인스턴스를 제공합니다.iphone sdk에서 NSData를 CGDataProviderRef로 변환하는 방법은 무엇입니까?

CGImageRef 인스턴스로 변환해야하므로 CGImageCreateWithPNGDataProvider 메서드를이 CGImageRef와 함께 실행할 수 있습니다.

나는 두 가지 방법을 시도했다 : 1) 그것을 던지기.

CGImageRef ref = (CGDataProvider) nsdata;

2) CGDataProviderCreateWithCFData (nsdata)를 실행하려면;

첫 번째 경우는 빈 이미지를 반환하지만 명령은 실패하지 않습니다. 두 번째 경우를 시도한 이유는 비록 NSData가 있고 CFData가 아니더라도 읽음을 모두 받아들이 기 때문입니다. 이유가 무엇이든, 이로 인해 실패했습니다.

내 PNG NSData를 사용하여 손상되지 않은 CGImage를 만드는 방법이 있습니까? 도와주세요.

THanks

답변

3

첫 번째 것은 매우 잘못되었습니다. 단순히 캐스팅하여 NSData 인스턴스를 CGImageRef으로 전환 할 수 없습니다.

두 번째 잘 작동합니다. NSData 인스턴스를 CFDataRef으로 캐스팅해야하지만, Apple이 무료 전화 브리징이라고 부르는 이유로 완벽하게 합법적입니다. 여기

다른과 훨씬 쉽게 방법입니다 :

나는 이미지를로드하기 위해 더 높은 레벨 UIImage 방법을 사용하고 낮은 수준의 핵심 그래픽 기능 image.CGImage을 사용하는 것을 선호
NSData* data = ... get raw image data from somewhere (PNG, JPEG, etc.) ...; 
UIImage* image = [UIImage imageWithData: data]; 
CGImageRef imageRef = image.CGImage; 

. 주변에 보관해야 할 경우 UIImage을 올바르게 보관하는 것을 잊지 마십시오.

+0

'image.CGImage'가'(CGImageRef) [(ID) CGImageCreateWithPNGDataProvider ((CGDataProviderRef) [(ID) CGDataProviderCreateWithNSData ((CFDataRef) UIImagePNGRepresentation (이미지)) 오토 릴리즈보다는 확실히 낫다 ], 0,0,0) autorelease]' –

+1

UIKit은 쓰레드에 안전하지 않으므로 백그라운드 스레드에'UIImage' 인스턴스를 생성하면 문제가 발생할 수 있습니다. 어떤 경우에는'CGImageRef'를 직접 만드는 것이 낫습니다. – cheeesus

+0

@cheeesus, Apple의 문서 (https://developer.apple.com/reference/uikit/uiimage)에 따르면 백그라운드 스레드에서 UIImage 인스턴스를 만드는 것이 안전합니다. * "이미지 개체의 불변 성은 또한 "* – Arda

9

두 번째 시도가 거의 옳습니다. CFData 및 NSData는 "수신자 부담 브리지"입니다. CFDataRef를 받아들이는 것도 NSData를 받아들입니다. (반대의 경우도 마찬가지입니다.) 올바르게 캐스팅해야합니다.

당신이 필요합니다

CGDataProviderCreateWithCFData((CFDataRef)myNSData); 
+2

ARC를 사용하는 경우 __bridge를 사용하여 직접 변환 : CGDataProviderCreateWithCFData ((__ bridge CFDataRef) myNSData); – situee

관련 문제