Изменение размера UIImage — проблемы с производительностью

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

Работать с размером экрана 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()

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


person cud_programmer    schedule 13.09.2014    source источник


Ответы (1)


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

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

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

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

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

Во-первых, прочитайте Руководство по программированию основных образов, чтобы понять, что вы можете сделать. Затем я рекомендую "Основные эффекты и методы изображения" с WWDC 2013 и "Достижения в области основных Изображение" с WWDC 2014.

person Rob Napier    schedule 13.09.2014