Cambiar el tamaño de UIImage: problemas de performance

Mi objective es utilizar AVFoundation para capturar y mostrar (usando una vista de superposition) la image capturada, debe ser idéntica a la de la capa de vista previa.

Trabajar con el tamaño de la pantalla del iPhone 4 "está bien, ya que simplemente implica un cambio de tamaño de la image capturada. Sin embargo, trabajar con el tamaño de la pantalla del iPhone 3.5" resulta más complejo, lo que requiere cambiar el tamaño y recortar.

Aunque tengo código que funciona tanto para las posiciones de la camera (frontal y posterior), el código para cambiar el tamaño / recorte de la image tomada por la camera trasera tiene algunos problemas de performance. He networkingucido el problema de performance al context de image más grande al cambiar el tamaño de la image. El context de image más grande es necesario para mantener la calidad de la retina de la image, mientras que la camera frontal es tan pobre que la image capturada no tiene calidad de retina.

El código en cuestión es:

 UIGraphicsBeginImageContext(CGSizeMake(width, height)) // where: width = 640, height = 1138 // image dimensions = 1080 x 1920 image.drawInRect(CGRectMake(0, 0, width, height)) image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() 

He buscado, pero no puedo encontrar una manera diferente y más eficiente de hacer esto. ¿Alguien puede ayudarme a superar este problema de performance? Gracias

No está completamente claro de su pregunta cuál es su input y salida definitiva, y cuáles son sus requisitos de time real. Intentaré tocar los puntos principales que necesites con algunas suposiciones sobre lo que estás haciendo.

Hay una decisión que no está clara en su pregunta, pero que debe hacer. Si se atrasa en el procesamiento, ¿deja los frameworks, baja calidad o retrasa la input? Cada uno de estos es un enfoque válido, pero eventualmente tendrá que hacer uno de ellos. Si no elige, se hará una elección para usted (por lo general, para retrasar la input, pero AVFoundation puede comenzar a tirar frameworks para usted, dependiendo de dónde esté procesando).

A la pregunta específica sobre el recorte, la herramienta que probablemente desee es CGImageCreateWithImageInRect . Es casi seguro que va a ser mucho más rápido que su solución actual para recortar (suponiendo que puede cambiar el tamaño en el time, lo que sugiere que puede).

CGImageCreateWithImageInRect es un caso especial porque solo se asoma a una image existente y, por lo tanto, puede ser muy rápido. En general, sin embargo, debe evitar fuertemente la creación de un nuevo CGImage o UIImage como no sea absolutamente necesario. Lo que generalmente quiere hacer es trabajar con el CIImage subyacente. Por ejemplo, puede transformar un CIImage con imageByApplyingTransform para escalarlo y imageByCroppingToRect para recortarlo. CIImage evita crear imágenes hasta que sea absolutamente necesario. Como dicen los docs, es realmente una "receta" para una image. Puede encadenar varios filters y ajustes, y luego aplicarlos todos en una gran transferencia de GPU. Mover datos a la GPU y volver a la CPU es increíblemente costoso; quieres hacerlo exactamente una vez. Y si te CIImage y tienes que soltar el marco, puedes soltar el CIImage sin tener que renderizarlo nunca.

Si tiene acceso a los datos YUV desde la camera (si está trabajando con CVPixelBuffer ), entonces CIImage es incluso más potente, ya que puede evitar hacer una transformación RBGA. CIImage también tiene la capacidad de desactivar la administración del color (que puede no importar si solo cambia el tamaño y el recorte, pero sí importa si modifica el color en absoluto). Desactivar la gestión del color puede ser una gran victoria. Para el trabajo en time real, CoreImage también puede funcionar en un EAGLContext y vivir en la GPU en lugar de tener que copyr una y otra vez a la CPU. Si el performance te está comiendo, quieres estas cosas.

Primero, lea la Guía de progtwigción de imágenes básicas para tener una idea de lo que puede hacer. Luego recomiendo "Core Image Effects and Techniques" de WWDC 2013 y "Advances in Core Image" de WWDC 2014 .