2014-09-13 2 views
3

Моя цель - использовать AVFoundation для захвата и отображения (с использованием оверлейного изображения) захваченного изображения - должно быть идентично таковому в слое предварительного просмотра.Изменение размера UIImage - Проблемы с производительностью

Работа с размером экрана iPhone 4 «отлично», поскольку это просто связано с изменением размера захваченного изображения. Однако работа с размером экрана iPhone 3.5 «оказывается более сложной», требующей изменения размера и обрезки.

Хотя у меня есть код, который работает для обоих положений камеры (передний & назад), код для изменения размера/обрезки изображения, снятого задней камерой, имеет некоторые проблемы с производительностью. При изменении размера изображения я уменьшил проблему с производительностью до более высокого контекста изображения. Более широкий контекст изображения необходим, чтобы сохранить качество изображения «сетчатки», в то время как передняя камера настолько плохая, что полученное изображение не имеет качества «сетчатки».

Код в вопросе:

UIGraphicsBeginImageContext(CGSizeMake(width, height)) 

// where: width = 640, height = 1138 
// image dimensions = 1080 x 1920 

image.drawInRect(CGRectMake(0, 0, width, height)) 
image = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

Я искал вокруг, но не может найти другой, более эффективный способ сделать это. Может ли кто-нибудь помочь мне преодолеть эту проблему производительности? Спасибо

ответ

5

Непонятно из вашего вопроса, каковы ваши конечные входные и выходные данные, и каковы ваши требования в реальном времени. Я попытаюсь затронуть основные моменты, которые вам нужны, с некоторыми предположениями о том, что вы делаете.

В вашем вопросе не ясно, но вы должны это сделать. Если вы отстаете в обработке, делаете ли вы падение кадров, качество капель или отставание ввода? Каждый из них является действительным подходом, но вы, , должны будете сделать один из них в. Если вы не выберете, для вас будет сделан выбор (обычно для задержки ввода, но AVFoundation может начать отбрасывать кадры для вас, в зависимости от того, где вы делаете свою обработку).

К конкретному вопросу об обрезке, возможно, вам нужен инструмент CGImageCreateWithImageInRect. Это почти наверняка будет намного быстрее, чем ваше текущее решение для обрезки (при условии, что вы можете изменить размер во времени, что вы предлагаете).

CGImageCreateWithImageInRect - особый случай, потому что он просто заглядывает в существующее изображение, и поэтому может быть очень быстрым. В общем, тем не менее, вам следует избегать создания новых CGImage или UIImage больше, чем вам абсолютно необходимо. То, что вы обычно хотите сделать, это работать с базовым CIImage. Например, вы можете преобразовать CIImage с imageByApplyingTransform, чтобы масштабировать его и imageByCroppingToRect, чтобы обрезать его. CIImage избегает создания изображений до тех пор, пока это не произойдет. Как говорят документы, это действительно «рецепт» для изображения. Вы можете объединить различные фильтры и настройки, а затем применить их все в одной большой передаче GPU. Перемещение данных на графический процессор и обратно в ЦП безумно дорого; вы хотите сделать это ровно один раз. И если вы отстаете и должны отказаться от фрейма, вы можете сбросить CIImage, не имея при этом его рендеринга.

Если у вас есть доступ к данным YUV с камеры (если вы работаете с CVPixelBuffer), то CIImage еще более мощный, поскольку он может избежать преобразования RBGA. CIImage также имеет возможность отключить управление цветом (что не имеет значения, если вы просто изменяете размер и обрезаете, но имеет значение, если вы вообще изменяете цвет). Отключение управления цветом может стать большой победой. Для работы в режиме реального времени CoreImage также может работать в EAGLContext и жить на графическом процессоре, а не копировать туда и обратно в CPU. Если вы едите, вы хотите этого.

Сначала прочитайте Core Image Programming Guide, чтобы узнать, что вы можете сделать. Затем я рекомендую «Основные эффекты и методы изображения» от WWDC 2013 и «Достижения в основном изображении» от WWDC 2014.

Смежные вопросы