ios - tiempo - iphonizate
Maneje imágenes grandes en iOS (3)
Quiero permitir que el usuario seleccione una foto, sin limitar el tamaño, y luego editarla.
Mi idea es crear una miniatura de la foto grande con el mismo tamaño que la pantalla para editar, y luego, cuando termine la edición, usar la foto grande para hacer la misma edición que se realizó en la miniatura.
Cuando uso UIGraphicsBeginImageContext
para crear una imagen en miniatura, causará un problema de memoria.
Sé que es difícil editar toda la imagen grande directamente debido a los límites de hardware, así que quiero saber si hay una manera de reducir la resolución de la imagen grande a menos de 2048 * 2048 sin problemas de memoria.
Descubrí que hay una clase BitmapFactory
que tiene una opción inSampleSize
que puede inSampleSize
la resolución de una foto en la plataforma Android. ¿Cómo se puede hacer esto en iOS?
Eche un vistazo a este trabajo de Trevor Harmon. Mejoró el rendimiento de mi aplicación. Creo que también funcionará para ti.
Debe manejar la carga de imágenes utilizando UIImage
que en realidad no carga la imagen en la memoria y luego crea un contexto de mapa de bits al tamaño de la imagen resultante que desea (de modo que esta será la cantidad de memoria utilizada). Luego debe iterar varias veces dibujando mosaicos desde la imagen original (aquí es donde se cargan partes de los datos de imagen en la memoria) utilizando CGImageCreateWithImageInRect
en el contexto de destino usando CGContextDrawImage
.
Las imágenes grandes no caben en la memoria. Entonces, cargarlos en la memoria para luego cambiar su tamaño no funciona.
Para trabajar con imágenes muy grandes tienes que colocarlos en mosaico. Muchas soluciones ya existen, por ejemplo, para ver si esto puede resolver su problema:
https://github.com/dhoerl/PhotoScrollerNetwork
Implementé mi propia solución personalizada, pero eso era específico de nuestro entorno, donde ya teníamos un instalador de imágenes ejecutándose en el servidor y solo podía solicitar mosaicos específicos de imágenes grandes (servidor madea, es realmente genial)
La razón por la que funciona el mosaico es que, básicamente, solo conservas los píxeles visibles en la memoria y no hay muchos. Todas las teselas que no están actualmente visibles se excluyen de la caché de disco o la memoria caché flash por así decirlo.