2010-08-21 22 views
5

Bir CGContextDrawImage çağrısında EXEC_BAD_ACCESS hatası alıyorum ve onu izlemeye çalışıyorum. Bir PNG görüntüsüne sahibim ve bir UIImagePNGRepresmenti çalıştırıyorum, o bana NSData örneğini veriyor.iPhone sdk üzerinde NSData CGDataProviderRef dönüştürmek nasıl?

Bunu CGImageRef örneğine dönüştürmem gerekiyor, bu yüzden CGImageCreateWithPNGDataProvider yöntemini bu CGImageRef ile çalıştırabilirim.

İki yol denedim: 1) Yayınlamak için.

CGImageRef ref = (CGDataProvider) nsdata;

2) CGDataProviderCreateWithCFData (nsdata) çalıştırmak için;

İlk harf boş görüntüyü döndürür, ancak komut başarısız olmaz. İkinci durumu denememin nedeni, NSData'm var ve CFData'ya sahip olmamam da, okumayı hatırlıyorum çünkü her ikisini de kabul ediyor. Sebep ne olursa olsun, bu durumdan dolayı başarısız oluyor.

PNG NSData'mı bozuk olmayan bir CGImage oluşturmak için kullanabileceğim bir yol var mı? Lütfen yardım edin.

THanks

cevap

3

Birincisi çok yanlış. Bir NSData örneğini, yalnızca CGImageRef içine çevirerek, bu dosyayı çeviremezsiniz.

İkincisi düzgün çalışmalıdır. 'a NSData örneğini dökmeniz gerekecek, ancak Apple'ın numaralı ücretsiz köprüsünü aramaları nedeniyle bu tamamen yasaldır. İşte

başka ve çok daha kolay bir yöntem olan:

Ben görüntüleri yüklemek için yüksek seviye UIImage yöntemleri kullanmak ve daha sonra alt düzey Çekirdek Grafik fonksiyonları için image.CGImage kullanmayı tercih
NSData* data = ... get raw image data from somewhere (PNG, JPEG, etc.) ...; 
UIImage* image = [UIImage imageWithData: data]; 
CGImageRef imageRef = image.CGImage; 

. Etrafında tutmanız gerekiyorsa, UIImage numaralı telefonu düzgün bir şekilde saklamayı unutmayın.

+0

'image.CGImage'' (CGImageRef) [(id) CGImageCreateWithPNGDataProvider ((CGDataProviderRef) [(id) CGDataProviderCreateWithNSData ((CFDataRef) UIImagePNGRepresentation (görüntü)) autorelease kesinlikle daha iyi ], 0,0,0) autorelease] ' –

+1

UIKit'in thread-safe olmadığına dikkat edin, bu yüzden arka plandaki thread'larda 'UIImage' örnekleri oluşturmak sorunlara yol açabilir. Bazı durumlarda, doğrudan bir 'CGImageRef' oluşturmak daha iyidir. – cheeesus

+0

@cheeesus, Apple'ın belgelerine göre (https://developer.apple.com/reference/uikit/uiimage), UIImage örneklerini arka plan iş parçacıklarında oluşturmak güvenlidir: * "Görüntü nesnelerinin değişmez doğası, aynı zamanda Herhangi bir iş parçacığı oluşturmak ve kullanmak için güvenli. "* – Arda

9

İkinci denemeniz neredeyse doğru. CFData ve NSData “ücretsiz köprülü” dir. Bir CFDataRef'i kabul eden herhangi bir şey de NSData'yı (ve tersini) kabul eder - sadece doğru bir şekilde yazmanız gerekir.

Sen gerekir:

CGDataProviderCreateWithCFData((CFDataRef)myNSData); 
+2

ARC varsa, doğrudan dönüştürmek için __bridge kullanın: CGDataProviderCreateWithCFData ((__ bridge CFDataRef) myNSData); – situee