Mi aplicación descarga un conjunto de archivos de imagen de la red y los guarda en el disco local del iPhone. Algunas de esas imágenes tienen un tamaño bastante grande (anchos superiores a 500 píxeles, por ejemplo). Dado que el iPhone ni siquiera tiene una pantalla lo suficientemente grande para mostrar la imagen en su tamaño original, planeo cambiar el tamaño de la imagen a algo un poco más pequeño para ahorrar espacio / rendimiento.
Además, algunas de esas imágenes son JPEG y no se guardan como la configuración habitual de calidad del 60%.
¿Cómo puedo cambiar el tamaño de una imagen con el SDK de iPhone y cómo puedo cambiar la configuración de calidad de una imagen JPEG?
La forma más fácil y sencilla de cambiar el tamaño de sus imágenes sería esta
fuente
Los métodos anteriores funcionan bien para imágenes pequeñas, pero cuando intenta cambiar el tamaño de una imagen muy grande, rápidamente se quedará sin memoria y la aplicación se bloqueará. Una forma mucho mejor es usar
CGImageSourceCreateThumbnailAtIndex
para cambiar el tamaño de la imagen sin decodificarla completamente primero.Si tiene la ruta a la imagen que desea cambiar de tamaño, puede usar esto:
Más detalles aquí .
fuente
CGImageSource
además de imágenes y pdfs?inSampleSize
que sea utilizado por el decodificador de Android. Y esta es la única respuesta que proporciona una forma de reducir una imagen de una manera eficiente en la memoria.La mejor manera de escalar imágenes sin perder la relación de aspecto (es decir, sin estirar la imagen) es usar este método:
Agregue este método a su clase de utilidad para que pueda usarlo en todo su proyecto y acceda a él así:
Este método se encarga de escalar mientras mantiene la relación de aspecto. También agrega sangrías a la imagen en caso de que la imagen reducida tenga más ancho que alto (o viceversa).
fuente
Si tiene control sobre el servidor, le recomiendo encarecidamente cambiar el tamaño del lado del servidor de imágenes con ImageMagik . Descargar imágenes grandes y cambiar su tamaño en el teléfono es un desperdicio de muchos recursos valiosos: ancho de banda, batería y memoria. Todos los cuales son escasos en los teléfonos.
fuente
Desarrollé una solución definitiva para el escalado de imágenes en Swift.
Puede usarlo para cambiar el tamaño de la imagen para rellenar, rellenar de aspecto o ajustar el aspecto al tamaño especificado.
Puede alinear la imagen al centro o cualquiera de los cuatro bordes y las cuatro esquinas.
Y también puede recortar el espacio adicional que se agrega si las relaciones de aspecto de la imagen original y el tamaño del objetivo no son iguales.
Hay ejemplos de cómo aplicar esta solución a continuación.
El rectángulo gris es el tamaño de la imagen del sitio de destino. Círculos azules en un rectángulo azul claro es la imagen (usé círculos porque es fácil de ver cuando está escalado sin preservar el aspecto). El color naranja claro marca las áreas que se recortarán si pasa
trim: true
.Ajuste de aspecto antes y después del escalado:
Otro ejemplo de ajuste de aspecto :
Ajuste de aspecto con alineación superior:
Relleno de aspecto :
Llenar :
Utilicé la ampliación en mis ejemplos porque es más fácil de demostrar, pero la solución también funciona para la reducción como en la pregunta.
Para la compresión JPEG, debe usar esto:
Puedes ver mi esencia con Xcode playground.
fuente
Para Swift 3, el siguiente código escala la imagen manteniendo la relación de aspecto. Puede leer más sobre ImageContext en la documentación de Apple :
Para usarlo, llame al
resizeImage()
método:fuente
puede usar este código para escalar la imagen en el tamaño requerido.
fuente
Según esta sesión, iOS Memory Deep Dive , es mejor que usemos
ImageIO
para reducir la escala de imágenes.Lo malo de usar
UIImage
imágenes a escala reducida.Utilizar
ImageIO
ImageIO puede leer tamaños de imagen e información de metadatos sin ensuciar la memoria.
ImageIO puede cambiar el tamaño de las imágenes a costa de solo cambiar el tamaño de la imagen.
Acerca de la imagen en la memoria
UIGraphicsBeginImageContextWithOptions
siempre usaSRGB
formato de renderizado, que usa 4 bytes por píxel.load -> decode -> render
3 fases.UIImage
es caro para el tamaño y el cambio de tamañoPara la siguiente imagen, si usa
UIGraphicsBeginImageContextWithOptions
, solo necesitamos 590KB para cargar una imagen, mientras que necesitamos2048 pixels x 1536 pixels x 4 bytes per pixel
= 10MB al decodificarmientras que
UIGraphicsImageRenderer
, introducido en iOS 10, seleccionará automáticamente el mejor formato gráfico en iOS12. Significa que puede ahorrar el 75% de la memoria reemplazandoUIGraphicsBeginImageContextWithOptions
conUIGraphicsImageRenderer
si no necesita SRGB.Este es mi artículo sobre imágenes de iOS en la memoria.
o
fuente
Un problema que puede ocurrir en las pantallas retina es que ImageCapture o algo así establece la escala de la imagen. Las funciones de cambio de tamaño anteriores no cambiarán eso. En estos casos, el cambio de tamaño no funcionará correctamente.
En el siguiente código, la escala se establece en 1 (no escalada) y la imagen devuelta tiene el tamaño esperado. Esto se hace en la
UIGraphicsBeginImageContextWithOptions
llamada.fuente
Agregando a la gran cantidad de respuestas aquí, pero he optado por una solución que cambia el tamaño por tamaño de archivo, en lugar de dimensiones.
Esto reducirá las dimensiones y la calidad de la imagen hasta que alcance el tamaño indicado.
Crédito por escalar por respuesta de tamaño
fuente
Versión rápida
fuente
Terminé usando la técnica de Brads para crear un
scaleToFitWidth
métodoUIImage+Extensions
si eso es útil para alguien ...entonces donde quieras
#import "UIImage+Extensions.h"
UIImage *newImage = [image scaleToFitWidth:100.0f];
También vale la pena señalar que puede mover esto más abajo en una
UIView+Extensions
clase si desea renderizar imágenes desde una UIViewfuente
Solo quería responder esa pregunta para los programadores de Cocoa Swift. Esta función devuelve NSImage con un nuevo tamaño. Puedes usar esa función así.
fuente
Si su imagen está en el directorio de documentos, agregue esta extensión de URL :
Uso:
Nota: - Cambie <LocalImagePath.jpg> con su ruta de imagen jpg local.
fuente
Si alguien sigue buscando una mejor opción
fuente
fuente
Para cambiar el tamaño de una imagen, tengo mejores resultados (gráficos) al usar esta función en lugar de DrawInRect:
La relación de aspecto se cuida automáticamente
fuente