Прежде всего очевидные вещи, которые не имеют прямого отношения к вашему вопросу: AVCaptureVideoPreviewLayer
- это самый дешевый способ транслировать видео с любой из камер в независимое представление, если это то, откуда поступают данные, и вы нет никаких непосредственных планов изменить это. Вам не нужно нажимать на себя, слой предварительного просмотра напрямую подключается к AVCaptureSession
и обновляется.
Я должен признать, что не уверен в центральном вопросе. Существует семантическая разница между CIImage
и двумя другими типами изображений - CIImage
- это рецепт изображения, который не обязательно поддерживается пикселями. Это может быть что-то вроде «возьмите отсюда пиксели, преобразуйте так, примените этот фильтр, трансформируйте вот так, объедините с этим другим изображением, примените этот фильтр». Система не знает, как выглядит CIImage
, пока вы не решите ее визуализировать. Он также по сути не знает соответствующих границ для его растеризации.
UIImage
подразумевает просто обернуть CIImage
. Он не конвертирует его в пиксели. Предположительно UIImageView
должен достичь этого, но если это так, то я не могу найти, где вы бы поставили соответствующий выходной прямоугольник.
Я добился успеха, только пытаясь обойти проблему:
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIContext *temporaryContext = [CIContext contextWithOptions:nil];
CGImageRef videoImage = [temporaryContext
createCGImage:ciImage
fromRect:CGRectMake(0, 0,
CVPixelBufferGetWidth(pixelBuffer),
CVPixelBufferGetHeight(pixelBuffer))];
UIImage *uiImage = [UIImage imageWithCGImage:videoImage];
CGImageRelease(videoImage);
С дает очевидную возможность указать выходной прямоугольник. Я уверен, что есть маршрут без использования CGImage
в качестве посредника, поэтому, пожалуйста, не думайте, что это решение - лучшая практика.