Как конвертировать NSData в CGDataProviderRef на iphone SDK? - PullRequest
5 голосов
/ 21 августа 2010

Я получаю ошибки EXEC_BAD_ACCESS в вызове CGContextDrawImage и пытаюсь отследить его.У меня есть изображение в формате PNG, и я запускаю UIImagePNGRepresentation или он дает мне экземпляр NSData.

Мне нужно преобразовать это в экземпляр CGImageRef, чтобы я мог запустить метод CGImageCreateWithPNGDataProvider с этим CGImageRef.два способа: 1) привести его.

CGImageRef ref = (CGDataProvider) nsdata;

2) запустить CGDataProviderCreateWithCFData (nsdata);

В первом случае возвращается пустое изображение,хотя команда не терпит неудачу.Причина, по которой я попробовал второй случай, хотя у меня есть NSData, а не CFData, заключается в том, что я помню, что при чтении он принимает оба варианта.Какова бы ни была причина, из-за этого происходит сбой.

Есть ли способ, с помощью которого я могу использовать свои PNG NSData для создания CGImage, который не поврежден?Пожалуйста, помогите.

Спасибо

Ответы [ 2 ]

9 голосов
/ 21 августа 2010

Ваша вторая попытка почти верна.CFData и NSData являются «бесплатными мостами».Все, что принимает CFDataRef, также принимает NSData (и наоборот) - вам просто нужно правильно разыграть.

Вам нужно:

CGDataProviderCreateWithCFData((CFDataRef)myNSData);
3 голосов
/ 21 августа 2010

Первое очень неправильно.Вы не можете превратить экземпляр NSData в CGImageRef просто путем его приведения.

Второй должен работать нормально.Вам придется преобразовать экземпляр NSData в CFDataRef, но это совершенно законно из-за того, что Apple называет бесплатный звонок .

Вот еще один и гораздо более простой метод:

NSData* data = ... get raw image data from somewhere (PNG, JPEG, etc.) ...;
UIImage* image = [UIImage imageWithData: data];
CGImageRef imageRef = image.CGImage;

Я предпочитаю использовать методы UIImage более высокого уровня для загрузки изображений, а затем использовать image.CGImage для основных графических функций более низкого уровня.Не забудьте правильно сохранить UIImage, если вам нужно его сохранить.

...