Inicio > CodeIgniter, Programación web > Generar imagenes dinámicamente en CodeIgniter

Generar imagenes dinámicamente en CodeIgniter

Viernes, 13 de Marzo de 2009

A veces nos puede interesar crear imágenes dinámicamente a partir de alguna que ya tengamos alojada en nuestro servidor, a continuación veremos como hacerlo con la ayuda de CodeIgniter.

Una imagen generada dinámicamente puede tener varias ventajas como por ejemplo:

  • Podemos controlar fácilmente cuanta gente la esta viendo
  • Restringir la visión de esta a los usuarios que queramos
  • Evitar que los usuarios tengan acceso a la imagen original
  • Poder generar una imagen del tamaño que queramos según convenga
  • Generar thumbnails, o modificaciones de la imagen original sin tener que generar copias

Esta ultima ventaja también nos trae a la desventaja, según lo que queramos, ya que al generar una imagen dinámicamente en PHP lo que estamos haciendo es aligerar la carga en el disco duro pero augmentar el tamaño del procesamiento, con lo que estamos cargando al servidor.Para conseguir hacer eso es tan fácil como crear una función en CodeIgniter que con la ayuda de la librería de imágenes “Image Manipulation Class” o “image_lib”. En la “user_guide” de CodeIgniter podéis ver que esta librería nos da un gran abanico de funciones y propiedades para poder trabajar con imágenes, pero por lo que nos interesa a nosotros usaremos solo unas pocas.

class Imagenes extends Controller
{

	function Imagenes()
	{
		parent::Controller();
	}

	function index()
	{
		$this->load->view("imagen");
	}

	function muestraImagen($width, $height, $ratio)
	{
		$config['source_image'] = "imagen.jpg";
		$config['maintain_ratio'] = $ratio;
		$config['dynamic_output'] = TRUE;
		$config['width'] = $width;
		$config['height'] = $height;

		$this->load->library('image_lib', $config);
		$this->image_lib->resize();
	}
}

Como podéis ver, el código es bien sencillo, solo es necesario especificar el ancho, la altura, si queremos que mantenga el ratio (es decir las proporciones) y decirle donde se encuentra la imagen. Normalmente en una aplicación real la “url” de la imagen la sacareis de una base de datos.

A continuación en la vista es tan simple como en el atributo “src” de la imagen, hacer la llamada a nuestra función con los parámetros deseados.

<img src="index.php/imagenes/muestraImagen/300/300/1" />

Aquí tenéis una DEMO para que veáis que funciona de verdad.

Para acabar comentaros, que para crear un thumbnail de una imagen (al disco duro), es casi idéntico a esto, solo que cambia el parámetro de “dynamic_output” y un par de cosas mas que os lo dejo en el aire para que podáis indagar vosotros mismos.

Lagarto CodeIgniter, Programación web , , , , , ,

  1. Viernes, 13 de Marzo de 2009 a las 13:27 | #1

    ¿Tu no te habias pasado a Cake? :D:D:

    COn respecto al artículo, muy interesante. Hace poco estuve haciendo algunas pruebas en este sentido y aunque me gustó la idea de tener las imñagenes almacenadas con un código (resource/001) y generarla según la info que tengo en una tabla. Pero eso cuesta también una lectura a la BD cada vez que se muestra una imagen. Y se da que muchas veces hay que mostrar muchas imágenes simultaneamente (una galería por ejemplo) y no sé que costo tiene eso.

    De entrada, tuve que modificar en el config la opcion de pconnect a FALSE.

  2. Viernes, 13 de Marzo de 2009 a las 13:40 | #2

    Si, en el curro me dijeron que tenia que usar CakePHP y tal, pero al final conseguí que me dejasen usar CodeIgniter, así que mejor que mejor.

    Hombre, yo entiendo que si generas una galería, igualmente tendrás que leer de base de datos al menos la URL o el nombre de la imagen, así que creo que en ese tema da igual.

    Pero, en efecto es una solución que va bien aplicarla según el caso que nos interese mas, ahorrar CPU o espacio en disco.

  3. Sábado, 14 de Marzo de 2009 a las 13:00 | #3

    Me alegro que puedas seguir con CI, no porque Cake sea peor sino porque a veces no dan ganas de ponerse a aprender algo.

    Sobre la galería, en realidad tendría que revisar lo que hice ya que veo que es mejorable.

    Yo hice un solo acceso a los “resources”, por cada imagen mostrada se lee sus datos. O sea al hacer un <img… se lee la bd y se muestra. Pero podría mezclar con tu método y hacer las lecturas previas (que de hecho lo tengo que hacer para armar la galería) y pasar como parámetros el ancho/alto y demás.

    Ya lo probaré.

    Por cierto, tus tutoriales me han sido de gran ayuda para empezar con CI, aunque luego he modificado bastante lo que has hecho. Ya lo publicaré en mi blog algún dia…

  4. Sábado, 14 de Marzo de 2009 a las 16:57 | #4

    Me alegro que te sirvan de ayuda, y si, mi idea era esa, que sirvan estos tutoriales como base, para aprender y que luego al coger mas soltura, cada uno lo modifique y lo acompleje como se desee.

  5. Jose
    Lunes, 4 de Mayo de 2009 a las 00:21 | #5

    Hola, resulta que tengo una duda con codeigniter, y tu eres el único en castellano que parece que lo dominas.

    Ya se que no es sitio para preguntar, pero no encontraba tu correo por lo tanto te lo dejo en un comentario.

    Yo me he creado mi controlador, y fuera aparte mi vista. Hasta aquí todo bien. Pero quiero darle formato a mi vista con css, pero quiero colocarlas en un archivo externo. Pero codeigniter no me coge este archivo.

    La hoja de estilo la he colocado dentro de la carpeta view/css

    La he llamado desde mi vista y desde mi controlador pero algo debo de estar aciendo mal.

    La llamada desde la vista es:

    En que estoy fallando?

    Gracias por tu ayuda.

  6. Lunes, 4 de Mayo de 2009 a las 15:59 | #6

    No es necesario que el CSS este dentro de “views”… yo normalmente creo una carpeta (css/) en la raíz de la aplicación (donde esta tu index.php y tu system/).

    Luego es tan fácil como linkar ese CSS desde cualquier vista, por ejemplo

    Saludos

  7. Hugo
    Viernes, 24 de Julio de 2009 a las 20:09 | #7

    hola tal vez sepas como crear una imagen hecho en codeigniter, o sea una imagen de 0 no modificar una que ya existe, de antemano gracias.

  1. Sin trackbacks aún.