La manipulación de imágenes en el backend es una de esas funcionalidades que tarde o temprano necesitas: redimensionar imágenes subidas por usuarios, recortar thumbnails, optimizar peso para mejorar velocidad o incluso rotarlas automáticamente.
En esta guía te voy a enseñar cómo hacerlo en CodeIgniter usando su librería de imágenes. No solo veremos el código, sino cuándo usar cada método y cómo evitar errores comunes.
Vamos a conocer como podemos realizar operaciones sobre imágenes en CodeIgniter 4; en otras palabras, el procesamiento digital de imágenes; vamos a conocer las comunes.
Qué es la manipulación de imágenes en backend
Cuando hablamos de manipulación o procesamiento digital de imágenes en backend, nos referimos a modificar imágenes directamente en el servidor usando PHP.
Esto incluye:
- Rotar imágenes
- Redimensionarlas
- Recortarlas
- Reducir su calidad
- Generar thumbnails
- Ajustar proporciones
La mayoría de veces he necesitado esto para optimizar imágenes subidas por usuarios. Suben fotos enormes (4000px o más) y si no las procesas, tu servidor y tu rendimiento web lo van a notar.
Librerías disponibles: GD vs Imagick
En CodeIgniter 4 puedes trabajar con:
- GD (por defecto en muchos servidores)
- Imagick (más potente y flexible)
GD
- Más común.
- Suficiente para operaciones básicas.
Imagick
- Mejor rendimiento en operaciones complejas.
- Más opciones avanzadas.
- Ideal para crop precisos y procesamiento profesional.
Si tu proyecto requiere procesamiento intensivo, Imagick suele ser mejor opción.
Cómo funciona la librería Image en CodeIgniter 4
Para todas las operaciones, siempre tenemos que cargar la imagen que queremos procesar; para eso, tenemos un servicio en CodeIgniter 4:
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png');De por medio, tenemos la operación que queremos realizar, rotar, escalar, crop...
Y finalmente, guardamos el resultado con:
save(WRITEPATH . 'uploads/imagemanipulation/image_rotate.png');El flujo es siempre el mismo:
cargar → procesar → guardar
Este patrón es clave. De hecho, siempre trabajo así: primero preparo el archivo, luego aplico la operación que necesito (rotar, escalar, crop…) y por último guardo el resultado.
Preparando nuestras operaciones sobre la manipulación de imágenes
Vamos a crear un archivo controlador y su respectiva clase en donde registramos estas operaciones:
class ImageManipulation extends BaseController
{
}Ya con esto estamos listos para realizar cada una de las operaciones; entre las principales tenemos:
Rotar imágenes
Para rotar imágenes en 360 grados, tenemos la función llamada rotate la cual recibe los grados que deseas rotar:
public function image_rotate()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->rotate(270)
->save(WRITEPATH . 'uploads/imagemanipulation/image_rotate.png');
}El parámetro indica los grados (0–360).
Rotar imágenes suele ser necesario cuando los usuarios suben fotos desde el móvil con orientación incorrecta. Aplicar un rotate(270) o rotate(90) resuelve el problema rápidamente.
Redimensionar imágenes: resize vs fit
La función llamada resize recibe tres parámetros:
- Escalado en el eje X
- Escalado en el eje Y
- Si deseas mantener las proporciones de la imagen o el aspect ratio
public function image_resize()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->resize(100, 100,false)
->save(WRITEPATH . 'uploads/imagemanipulation/image_resize.png');
}Parámetros:
- Ancho
- Alto
- Mantener proporciones (true/false)
Si colocas false, puedes deformar la imagen.
O
fit()
public function image_fit()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->fit(100, 100, 'center')
->save(WRITEPATH . 'uploads/imagemanipulation/image_fit.png');
}Este método:
- Ajusta proporciones automáticamente
- Recorta lo necesario
- Centra la imagen
En la práctica, casi siempre uso fit() cuando necesito thumbnails cuadrados. Me ha evitado deformaciones visuales en galerías.
¿Cuándo usar cada uno?
- Mantener proporciones estrictas → resize(true)
- Crear thumbnails perfectos → fit()
- Reducción rápida sin precisión → resize(false)
Recortar imágenes (crop) correctamente
Para recortar una porción de la imagen, tenemos la función de image_crop, la cual le tienes que especificar una librería; generalmente se usa la de 'imagick' la cual nos permite hacer este tipo de operaciones fácilmente; la función crop recibe 4 puntos, que equivalen a la posición x1,y1 - x2,y2
$xOffset = 100;
$yOffset = 100;
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->crop(50, 50, $xOffset, $yOffset)
->save(WRITEPATH . 'uploads/imagemanipulation/image_crop.png');Calcular offsets dinámicos es mucho mejor que usar valores fijos. Puedes obtener propiedades de la imagen y centrar el recorte automáticamente.
Reducir calidad y peso de imágenes
Bajar la calidad de las imágenes es útil para reducir el peso sobre las mismas:
public function image_quality()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->fit(300, 300, 'center')
->save(WRITEPATH . 'uploads/imagemanipulation/image_quality.png', 15);
}El Factor, en este ejemplo 15 determina la calidad de la imagen, en donde 0 es lo menos posible y 100 por ciento es la calidad máxima.
El segundo parámetro indica calidad:
- 0 → mínima calidad
- 100 → máxima calidad
Suelo trabajar entre 60 y 80 para equilibrio entre calidad visual y peso.
Reducir calidad puede disminuir drásticamente el tamaño del archivo sin afectar perceptiblemente la imagen.
Código completo del controlador
Finalmente, el código completo del ejercicio:
class ImageManipulation extends BaseController
{
public function image_fit()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->fit(100, 100, 'center')
->save(WRITEPATH . 'uploads/imagemanipulation/image_fit.png');
}
public function image_rotate()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->rotate(270)
->save(WRITEPATH . 'uploads/imagemanipulation/image_rotate.png');
}
public function image_resize()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->resize(100, 100,false)
->save(WRITEPATH . 'uploads/imagemanipulation/image_resize.png');
}
public function image_quality()
{
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->fit(300, 300, 'center')
->save(WRITEPATH . 'uploads/imagemanipulation/image_quality.png', 15);
}
public function image_crop()
{
/* $info = \Config\Services::image('imagick')
->withFile(WRITEPATH.'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->getFile()
->getProperties(true);
$xOffset = ($info['width'] / 2) - 25;
$yOffset = ($info['height'] / 2) - 25;*/
$xOffset = 100;
$yOffset = 100;
$image = \Config\Services::image()
->withFile(WRITEPATH . 'uploads/movies/5/1575128863_4acadf20ebe48354c5c3.png')
->crop(50, 50, $xOffset, $yOffset)
->save(WRITEPATH . 'uploads/imagemanipulation/image_crop.png');
}
}Buenas prácticas y errores comunes
- No deformar imágenes sin intención.
- No guardar siempre con calidad 100.
- Validar que el archivo exista antes de procesarlo.
- Usar Imagick si el servidor lo permite.
- No sobrescribir imágenes originales sin backup.
Preguntas frecuentes sobre manipulación de imágenes
- ¿Cómo rotar una imagen en CodeIgniter 4?
- Usando el método rotate(grados) antes de guardar.
- ¿Cómo mantener proporciones al redimensionar?
- Usa resize(ancho, alto, true) o mejor fit().
- ¿Cómo reducir el peso de una imagen?
- Ajustando el segundo parámetro de save().
- ¿CodeIgniter usa GD o Imagick?
- Puede usar ambas. GD es común; Imagick es más potente.
Conclusión
La manipulación de imágenes en CodeIgniter 4 es sencilla cuando entiendes el flujo básico: cargar, procesar y guardar.
La clave no está solo en saber usar rotate(), resize() o crop(), sino en entender cuándo usar cada uno y cómo optimizar resultados para rendimiento y calidad.
Si aplicas estas prácticas correctamente, podrás:
- Optimizar peso
- Mejorar rendimiento web
- Generar thumbnails profesionales
- Evitar imágenes deformadas
Y todo directamente desde el backend.
Puedes ver el código completo, este material forma parte de mi curso completo de CodeIgniter 4: