2012-06-05 44 views
10

Trong trường hợp nào thì CGBitmapContext sẽ không phân bổ? Tôi có chế độ xem bảng và có nhiều tùy chọn chế độ xem. Người dùng có thể thấy một ô bảng nhỏ chỉ với bản xem trước, một bản xem trước lớn hơn trên mỗi dòng hoặc hai bản xem trước bên mỗi dòng. Hai cái đầu chỉ vẽ tốt, nhưng cái thứ ba bị hỏng. Không có thông báo lỗi từ CGBitmapContextCreate, chỉ là lỗi sau khi tôi cố gắng sử dụng nó (tức là ngữ cảnh không hợp lệ 0x0).CGBitmapContextTạo trả về NULL

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
//size is a passed parameter 
CGContextRef c = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaNoneSkipLast); 
CGColorSpaceRelease(colorSpace); 

Tôi đang nhắm mục tiêu iOS 5.0, đang xây dựng với 5.1. Sự khác biệt duy nhất giữa phiên bản làm việc và không hoạt động là phiên bản không làm việc cố gắng thực hiện nó hai lần (kích thước nhỏ, nhỏ hơn 100x100). Chỉ phía bên phải có vấn đề này (tức là lần thử thứ hai). Nỗ lực đầu tiên vẫn hoạt động.

Trả lời

13

Điều này có thể xảy ra nếu size.width và/hoặc size.height là 0. Đặt NSLog để kiểm tra kích thước mỗi lần bạn gọi phương thức này để xem trường hợp đó có xảy ra hay không.

+1

Ah, tuyệt vời. Tôi nghĩ tôi đã kiểm tra chúng, nhưng dường như không đủ tốt. Một số người trong số họ, trên thực tế, 0. Thực hiện tốt, cảm ơn !! – borrrden

4

Đối với hậu thế, điều này cũng có thể xảy ra nếu bạn chỉ định 'bytesPerRow' không đủ lớn để chứa chiều rộng được chỉ định.

Sử dụng mã mẫu của Apple từ https://developer.apple.com/library/ios/qa/qa1702/_index.html

tôi nhận thấy rằng CVPixelBufferGetWidth(), CVPixelBufferGetHeight(), và CVPixelBufferGetBytesPerRow() trở lại được trở về 1280, 720, và 1960 tương ứng. Giá trị 'bytesPerRow' ở đây (1960), không đủ rộng để giữ tất cả các byte cho một hình ảnh rộng 1280 pixel. Có vẻ như đây có thể là lỗi trong API của Apple.

Vì vậy, thay vì sử dụng giá trị được trả về bởi CVPixelBufferGetBytesPerRow(), tôi đã sử dụng 'width * 4' và điều này chỉ hoạt động tốt!

+1

Cảm ơn thông tin bổ sung! Cũng giống như một caveat nhỏ nó sẽ chỉ có chiều rộng * 4 miễn là bạn đang sử dụng một RGBA hoặc tương tự 4 byte cho mỗi mô hình pixel. Ngoài ra, những con số bạn đề cập không phải là một lỗi. Hàm đó trả về số byte đúng cho mỗi hàng được sử dụng * trên phần cứng * (không nhất thiết phải đúng cho bộ nhớ). Nó được thảo luận [ở đây] (https://developer.apple.com/library/ios/qa/qa1829/_index.html) – borrrden