2010-08-21 29 views
5

Tôi nhận được lỗi EXEC_BAD_ACCESS trong một cuộc gọi CGContextDrawImage và cố gắng theo dõi nó trở lại. Tôi có một hình ảnh PNG và chạy một UIImagePNGRepresentation o nó mang lại cho tôi cá thể NSData.Làm thế nào để chuyển đổi NSData thành CGDataProviderRef trên iphone sdk?

Tôi cần chuyển đổi điều này sang phiên bản CGImageRef, vì vậy tôi có thể chạy phương thức CGImageCreateWithPNGDataProvider với CGImageRef này.

Tôi đã thử hai cách: 1) Để truyền.

CGImageRef ref = (CGDataProvider) nsdata;

2) Để chạy CGDataProviderCreateWithCFData (nsdata);

Trường hợp đầu tiên trả về hình ảnh trống, mặc dù lệnh không thành công. Lý do tôi đã thử trường hợp thứ hai, mặc dù tôi có NSData và không phải CFData là vì tôi nhớ đọc nó chấp nhận cả hai. Dù là lý do gì, nó không thành công do điều này.

Có cách nào tôi có thể sử dụng PNG NSData của mình để tạo CGImage không bị hỏng không? Xin vui lòng giúp đỡ.

THanks

Trả lời

3

Điều đầu tiên là rất sai. Bạn không thể biến một thể hiện NSData thành một CGImageRef chỉ đơn giản bằng cách truyền nó.

Cách thứ hai sẽ hoạt động tốt. Bạn sẽ phải bỏ phiên bản NSData thành CFDataRef nhưng điều đó hoàn toàn hợp pháp do những gì Apple gọi cầu nối miễn phí.

Dưới đây là một phương pháp và dễ dàng hơn nhiều:

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

Tôi thích sử dụng mức độ cao hơn UIImage phương pháp để tải hình ảnh và sau đó sử dụng image.CGImage cho cấp dưới chức năng cốt lõi Graphics. Đừng quên giữ đúng số UIImage nếu bạn cần giữ nó xung quanh.

+0

'image.CGImage' chắc chắn là tốt hơn so với '(CGImageRef) [(id) CGImageCreateWithPNGDataProvider ((CGDataProviderRef) [(id) CGDataProviderCreateWithNSData ((CFDataRef) UIImagePNGRepresentation (hình ảnh)) autorelease ], 0,0,0) autorelease] ' –

+1

Lưu ý rằng UIKit không an toàn với luồng, vì vậy việc tạo các thể hiện' UIImage' trên các chủ đề nền có thể dẫn đến các vấn đề. Trong một số trường hợp, bạn nên tạo trực tiếp 'CGImageRef'. – cheeesus

+0

@cheeesus, theo tài liệu của Apple (https://developer.apple.com/reference/uikit/uiimage), sẽ an toàn khi tạo các cá thể UIImage trong các chủ đề nền: * "Bản chất bất biến của các đối tượng hình ảnh cũng có nghĩa là chúng an toàn để tạo và sử dụng từ bất kỳ chủ đề nào. "* – Arda

9

Lần thử thứ hai của bạn gần như đúng. CFData và NSData là “cầu nối miễn phí”. Bất cứ điều gì chấp nhận một CFDataRef cũng chấp nhận NSData (và ngược lại) - bạn chỉ cần phải đúc một cách chính xác.

Bạn cần:

CGDataProviderCreateWithCFData((CFDataRef)myNSData); 
+2

Nếu bạn có ARC, hãy sử dụng __bridge để chuyển đổi trực tiếp: CGDataProviderCreateWithCFData ((__ bridge CFDataRef) myNSData); – situee

Các vấn đề liên quan