2012-06-05 2 views
10

어떤 상황에서 CGBitmapContext가 할당되지 못합니까? 테이블보기가 있고 여러보기 옵션이 있습니다. 사용자는 미리보기가있는 작은 표 셀, 한 줄에 하나 더 큰 미리보기 또는 한 줄에 두 번씩 나란히 미리보기를 볼 수 있습니다. 첫 번째 두 개는 잘 처리되지만 세 번째 것은 실패합니다. CGBitmapContextCreate의 오류 메시지가 없습니다. 사용하려고하면 오류가 발생합니다 (즉, 유효하지 않은 컨텍스트 0x0).CGBitmapContextCreate가 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); 

5.1으로 구축 한 iOS 5.0을 타겟팅하고 있습니다. 작동 버전과 비 작동 버전의 유일한 차이점은 작동하지 않는 버전이 두 번 시도한다는 것입니다 (크기는 100x100 미만으로 작습니다). 오른쪽에만이 있습니다 (즉 두 번째 시도). 첫 번째 시도는 여전히 작동합니다.

답변

13

size.width 및/또는 size.height이 0 인 경우이 문제가 발생할 수 있습니다. NSLog을 입력하여이 방법을 호출 할 때마다 크기를 확인하십시오.

+1

아, 훌륭함. 나는 그것들을 점검했다고 생각했지만 분명히 좋지는 않았다. 그 중 일부는 사실 0이었습니다. 잘 했어, 고마워 !! – borrrden

4

후행의 경우 지정된 너비를 수용 할만큼 충분히 크지 않은 'bytesPerRow'를 지정하면이 문제가 발생할 수도 있습니다. https://developer.apple.com/library/ios/qa/qa1702/_index.html

에서 애플의 샘플 코드를 사용

나는 CVPixelBufferGetWidth는(), CVPixelBufferGetHeight() 및 CVPixelBufferGetBytesPerRow()는 각각 1280, 720, 1960을 반환하고 반환 것으로 나타났습니다. 여기 'bytesPerRow'값 (1960)은 너비가 1280 픽셀 인 이미지의 모든 바이트를 저장할만큼 충분히 넓지 않습니다. 아마 애플의 API 버그 일 것 같습니다.

그래서 CVPixelBufferGetBytesPerRow()에서 반환 된 값을 사용하는 대신 'width * 4'를 사용했습니다.

+1

추가 정보를 제공해 주셔서 감사합니다! 작은주의 사항과 마찬가지로 픽셀 단위 RGBA 또는 이와 유사한 4 바이트를 사용하는 경우에만 너비가 * 4입니다. 또한 언급 한 숫자는 버그가 아닙니다. 이 함수는 하드웨어 *에서 사용 된 행 당 올바른 바이트 수를 반환합니다 (메모리에서 반드시 맞을 필요는 없음). 그것은 [여기] (https://developer.apple.com/library/ios/qa/qa1829/_index.html)에서 논의됩니다. – borrrden