¿Quieres registrarte?

Clase de PHP para crear Thumbnails de imágenes

Por: elchininet
21 de Mayo del 2009
3517 de clabLevel
Otros artículos de elchininet
8,385 visitas
php

Hace unos días tenía que hacer un sistema de administración donde en unos de sus módulos el cliente tenía que ser capaz de subir al servidor las imágenes que le correspondían a una serie de franquicias y luego en la web cuando seleccionara cada una de las franquicias debían aparecer estas imágenes con unas dimensiones determinadas. Habían dos tipos de imágenes, una era un Thumbnail que representaba a la franquicia y el resto eran imágenes que compondrían una galería.

Como el cliente tendría la libertad para subir cualquier imagen (sin importar sus dimensiones o peso) y no tenía experiencia con ningún software de edición de bitmaps, decidí que este trabajo debía realizarse desde el servidor.

Enseguida busqué en la web para ver si existían clases de edición de imágenes que utilizaran las funciones de php para redimensionar las mismas y me encontré con una enorme número de ellas, la mayoría trabajaba con las funciones natas de php, pero no tenían en cuenta el formato de la imagen y siempre guardaban un jpg (aunque el formato original no fuera este), esto provocaba en muchos casos que la imagen resultante fuera un cuadro negro (sobre todo con formatos gif).

Por otro lado ninguna de estas clases tenía un método que permitiera hacer un recorte de la imagen a las dimensiones que yo deseara sin variar las proporciones visuales de la imagen original, y esto me era imprescindible para generar automáticamente los thumbnails. Así que me di a la tarea de elaborar una clase que permitiera redimensionar las imágenes y crear los thumbnails sin variar la proporción visual de estas. El resultado fue el siguiente:

Fichero thumb.php

Código :

<?php
class thumb {

var $image;
var $type;
var $width;
var $height;

//---Método de leer la imagen
function loadImage($name) {

//---Tomar las dimensiones de la imagen
$info = getimagesize($name);

$this->width = $info[0];
$this->height = $info[1];
$this->type = $info[2];

//---Dependiendo del tipo de imagen crear una nueva imagen
switch($this->type){
case IMAGETYPE_JPEG:
$this->image = imagecreatefromjpeg($name);
break;
case IMAGETYPE_GIF:
$this->image = imagecreatefromgif($name);
break;
case IMAGETYPE_PNG:
$this->image = imagecreatefrompng($name);
break;
}
}

//---Método de guardar la imagen
function save($name, $quality = 100) {

//---Guardar la imagen en el tipo de archivo correcto
switch($this->type){
case IMAGETYPE_JPEG:
imagejpeg($this->image, $name, $quality);
break;
case IMAGETYPE_GIF:
imagegif($this->image, $name);
break;
case IMAGETYPE_PNG:
$pngquality = floor(($quality - 10) / 10);
imagepng($this->image, $name, $pngquality);
break;
}
}

//---Método de mostrar la imagen sin salvarla
function show() {

//---Mostrar la imagen dependiendo del tipo de archivo
switch($this->type){
case IMAGETYPE_JPEG:
imagejpeg($this->image);
break;
case IMAGETYPE_GIF:
imagegif($this->image);
break;
case IMAGETYPE_PNG:
imagepng($this->image);
break;
}
}

//---Método de redimensionar la imagen sin deformarla
function resize($value, $prop){

//---Determinar la propiedad a redimensionar y la propiedad opuesta
$prop_value = ($prop == 'width') ? $this->width : $this->height;
$prop_versus = ($prop == 'width') ? $this->height : $this->width;

//---Determinar el valor opuesto a la propiedad a redimensionar
$pcent = $value / $prop_value;
$value_versus = $prop_versus * $pcent;

//---Crear la imagen dependiendo de la propiedad a variar
$image = ($prop == 'width') ? imagecreatetruecolor($value, $value_versus) : imagecreatetruecolor($value_versus, $value);

//---Hacer una copia de la imagen dependiendo de la propiedad a variar
switch($prop){

case 'width':
imagecopyresampled($image, $this->image, 0, 0, 0, 0, $value, $value_versus, $this->width, $this->height);
break;

case 'height':
imagecopyresampled($image, $this->image, 0, 0, 0, 0, $value_versus, $value, $this->width, $this->height);
break;

}

//---Actualizar la imagen y sus dimensiones
$info = getimagesize($name);

$this->width = imagesx($image);
$this->height = imagesy($image);
$this->image = $image;

}

//---Método de extraer una sección de la imagen sin deformarla
function crop($cwidth, $cheight, $pos = 'center') {

//---Dependiendo del tamaño deseado redimensionar primero la imagen a uno de los valores
if($cwidth > $cheight){
$this->resize($cwidth, 'width');
}else{
$this->resize($cheight, 'height');
}

//---Crear la imagen tomando la porción del centro de la imagen redimensionada con las dimensiones deseadas
$image = imagecreatetruecolor($cwidth, $cheight);

switch($pos){

case 'center':
imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $cwidth) / 2), abs(($this->height - $cheight) / 2), $cwidth, $cheight, $cwidth, $cheight);
break;

case 'left':
imagecopyresampled($image, $this->image, 0, 0, 0, abs(($this->height - $cheight) / 2), $cwidth, $cheight, $cwidth, $cheight);
break;

case 'right':
imagecopyresampled($image, $this->image, 0, 0, $this->width - $cwidth, abs(($this->height - $cheight) / 2), $cwidth, $cheight, $cwidth, $cheight);
break;

case 'top':
imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $cwidth) / 2), 0, $cwidth, $cheight, $cwidth, $cheight);
break;

case 'bottom':
imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $cwidth) / 2), $this->height - $cheight, $cwidth, $cheight, $cwidth, $cheight);
break;

}

$this->image = $image;
}

}
?>


Los métodos de la clase son los siguientes:

Código :

// Lee la imagen desde la ruta especificada
loadImage($name:string)

// Guarda la imagen en la ruta especificada y con una calidad de 0 a 100 definida por el usuario (máxima calidad por defecto)
save($name:string, $quality:int = 100)

// Muestra la imagen en la página sin guardarla previamente
show()

// Redimensiona la imagen en ancho o alto manteniendo sus proporciones
// $prop puede tomar los valores de "width" o "height"
resize($value:int, $prop:string)

// Crea un thumbnail de la imagen con las medidas especificadas y manteniendo las proporciones visuales de la imagen intactas
// $pos puede tomar los valores de "left", "top", "right", "bottom" o "center"
crop($cwidth:int, $cheight:int, $pos:string)

Veamos un ejemplo concreto, aquí tenemos una imagen de 550 x 413 píxeles:



Vamos a crear una versión de la misma con un ancho de 100 píxeles:

fichero image_width_100.php

Código :

<?
include_once('thumb.php');
$mythumb = new thumb();
$mythumb->loadImage('http://img43.imageshack.us/img43/3022/finalfantasyn.jpg');
$mythumb->resize(100, 'width');
$mythumb->show();
?>

El resultado es el siguiente (en este momento estoy leyendo el php de arriba como una imagen) de la siguiente manera:

Código :

echo '<img src="image_width_100.php"/>';


Ejemplo de imagen con 100 píxeles de ancho

De la misma manera el siguiente link es la misma imagen con 100 píxeles de alto:

Ejemplo de imagen con 100 píxeles de alto

Y por último un crop de la imagen a 100 x 100 píxeles (igual a los avatares de aquí de la página):

Código :

<?
include_once('thumb.php');
$mythumb = new thumb();
$mythumb->loadImage('http://img43.imageshack.us/img43/3022/finalfantasyn.jpg');
// Como el rostro del personaje está a la derecha le especifico el parámetro $pos en "right"
// Si este valor es obviado el crop se hará del centro de la imagen
$mythumb->crop(100, 100, 'right');
$mythumb->show();
?>


Ejemplo de thumbnail a 100 x 100

Esta clase es muy util para los avatares de los foros, simpre se le advierte al usuario que debe subir una imagen de unas dimensiones específicas, pero los usuarios muchas veces no leen las reglas del foro o simplemente lo hacen por desconocimiento y entonces los avatares atentan contra el diseño del foro pues la imagen sale a su tamaño original. Podríamos utilizar esta clase para crear versiones de los thumbnails al tamaño que especifiquemos una vez que el usuario suba su imagen, de lo contrario hacer una versión al vuelo de esta imagen con las dimensiones que deseemos.

Espero que les sea de ayuda.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas php

Comentarios | Enviar un comentario
Muy útil esa clase (y)
Por: Zguillez
Gracias Z, haría falta arreglar en el método "crop" la primera condición, debe ser esta:

Código :

//---Dependiendo del tamaño deseado redimensionar primero la imagen a uno de los valores 
if(abs($this->width - $cwidth) < abs($this->height - $cheight)){          
   $this->resize($cwidth, 'width');          
}else{          
   $this->resize($cheight, 'height');        
}


De lo contrario el crop no se realiza bien en las imágenes verticales.

Muchas gracias.
Por: elchininet
:D Muy util.
Por: LongeVie
una clase demasiado complicada... es mejor hacer una funcion con imagemagick, con un tercio de las lineas que has usado...

function hacerThumb($imagen)
{
$img = new Imagick($imagen);
$w= $img -> getImageWidth();
$h= $img -> getImageHeight();

$maxWidth = 80; $maxHeight = 90;

$fitbyWidth = (($maxWidth/$w)<($maxHeight/$h)) ?true:false;
if($fitbyWidth)
{
$img->thumbnailImage($maxWidth, 0, false);
$img->writeImage($imagen);
}
else
{
$img->thumbnailImage(0, $maxHeight, false);
$img->writeImage($imagen);
}
}
Por: salotronic-blog
Lo primero que tenía que cumplir era esto:

Enseguida busqué en la web para ver si existían clases de edición de imágenes que utilizaran las funciones de php

Ya que en mi caso era imprescindible, si alguien necesita al igual que yo una clase que no requiera de instalación, esta le puede servir. Además la clase imageMagik antes de ser generada como dll es mucho más extensa que esta (lógico, tiene muchos más métodos y propiedades y es mucho mejor), las líneas de código que cuentan no son las de la clase, si no las finales que se utilizan al igual que las que tú has utilizado para image magik, el usuario sólo tiene que lidiar con esto:

Código :

<? 
include_once('thumb.php'); 
$mythumb = new thumb(); 
$mythumb->loadImage('imagen'); 
$mythumb->crop(100, 100); 
$mythumb->show();
?>

Por: elchininet
Hola, es muy buena, pero el problema que yo me encontré es que en la mayoría de hosting solo tienes 40Mb (memory_limit) para los procesos de PHP (se ve cargando la función phpinfo()). Y esta clase, que ya la he probado no funciona con fotos de 1Mb y pico, lo normal en cámaras de fotos de hoy en día, ya que excede en el consumo de memoria y da un error. Este error es muy típico y la gente no sabe como resolverlo, y es que o te amplian la memoria en tu hosting, u olvidate... Bueno, de todas formas, es un gran aporte!!!
Por: Chema-blog
Saludos a todos pues comentar que es muy buen aporte para poder redimensionar imagenes sin crear otras imagenes reducidas.

Mi problema es a un principio ejecute el codigo me corria correctamente pero luego empezo a salirme filas de caracteres y esto lo probe localmente. Y bueno no entiendo a que se debe esto Lo unico que podria ser y lo que alguien ya dijo anteriormente es por el limite de memoria.

Desearia saber como poder solucionar esto ya que me interesa este codigo.

Gracias...
Por: Christian-blog
@Chema es verdad que en esta versión no tuve en cuenta lo de remover las imágenes creadas y se va sobrecargando la memoria en el servidor, hace unos dias hice un tip donde utilizo una versión actualizada de la clase que si elimina las imágenes después de salvarlas o de mostrarlas. Y funciona con imágenes más grandes de un mega sin problemas, mi servidor tiene también 40Mb y redimensiono imágenes hasta de 3 megas, lo que no te lo recomiendo para mostrar en un sitio una imagen muy grande porque de todas maneras el servidor tiene que trabajar esta imagen y se demorará en mostrarla, las imágenes de 1 mega para arriba es para una administración (subirlas y redimensionarlas) y después la versión redimensionada es la que se muestran en el sitio al tamaño que se desea.

@Christian, esto sucede cuando quieres mostrar la imagen directamente lo que debes hacer es leer un fichero php como si fuera una imagen:

Código :

<img src="image.php"/>


y el fichero image.php es el que muestra la imagen:

Código :

//---image.php
<? 
include_once('thumb.php'); 
$mythumb = new thumb(); 
$mythumb->loadImage('tuimagen.php'); 
$mythumb->resize(450, 'width'); 
$mythumb->show(); 
?>

Por: elchininet
la clase es buenisima y la estoy usando, pero tengo un problema. A veces cuando hago crop en algunas imagenes me deja un espacio blanco debajo de la foto. No tengo en claro cuales son los tamaño originales de la foto porque no las subo yo, pero puede ser que sean mas chicas del tamaño al que le digo que cropee???
En ese caso, como puedo hacer para que si al hacer el crop la imgen queda mas chica del tamaño final que quiero que me haga el resize agrandando la imagen???
Por: Delfina delfirossi@gmail.
¿Y cambiaste esta parte?

elchininet :

Gracias Z, haría falta arreglar en el método "crop" la primera condición, debe ser esta:

Código :

//---Dependiendo del tamaño deseado redimensionar primero la imagen a uno de los valores 
if(abs($this->width - $cwidth) < abs($this->height - $cheight)){          
   $this->resize($cwidth, 'width');          
}else{          
   $this->resize($cheight, 'height');        
}


De lo contrario el crop no se realiza bien en las imágenes verticales.

Muchas gracias.

Por: elchininet
Es que usando eso me anda peor!
mira

Este es el codigo que uso
<?
include_once('thumb2.php');
$mythumb = new thumb();
$mythumb->loadImage('foto/01.jpg');
$mythumb->crop(300, 225,'bottom');
$mythumb->save('foto/01_2.jpg', 100);
?>



Esta es la imagen original:
http://www.soloazar.com.ar/foto/01.jpg

Este es el resultado:
http://www.soloazar.com.ar/foto/01_2.jpg


con el codigo original se me hacen espacios negros pero no son tan bruscos, y por lo menos el recorte lo hace mejor mira:
http://www.soloazar.com.ar/imagenes/11870f_220x165.jpg
Por: Delfina-blog
Pues si, resulta que es un bug, la clase la había pensado para reducir imágenes y no para aumentarlas, pero debería funcionar en los dos casos. Prueba con este update a ver si resuelve tu problema.

La copio completa para quien consulte no tenga que unir varios posts

Código :

<?php 
class thumb { 
    
   var $image; 
   var $type; 
   var $width; 
   var $height; 
    
   //---Método de leer la imagen 
   function loadImage($name) { 
       
      //---Tomar las dimensiones de la imagen 
      $info = getimagesize($name); 
       
      $this->width = $info[0]; 
      $this->height = $info[1]; 
      $this->type = $info[2];    
       
      //---Dependiendo del tipo de imagen crear una nueva imagen 
      switch($this->type){         
         case IMAGETYPE_JPEG: 
            $this->image = imagecreatefromjpeg($name); 
         break;         
         case IMAGETYPE_GIF: 
            $this->image = imagecreatefromgif($name); 
         break;         
         case IMAGETYPE_PNG: 
            $this->image = imagecreatefrompng($name); 
         break;         
      }      
   } 
    
   //---Método de guardar la imagen 
   function save($name, $quality = 100) { 
       
      //---Guardar la imagen en el tipo de archivo correcto 
      switch($this->type){         
         case IMAGETYPE_JPEG: 
            imagejpeg($this->image, $name, $quality); 
         break;         
         case IMAGETYPE_GIF: 
             imagegif($this->image, $name); 
         break;         
         case IMAGETYPE_PNG: 
            $pngquality = floor(($quality - 10) / 10); 
            imagepng($this->image, $name, $pngquality); 
         break;         
      }
     imagedestroy($this->image);
   } 
    
   //---Método de mostrar la imagen sin salvarla 
   function show() { 
       
      //---Mostrar la imagen dependiendo del tipo de archivo 
      switch($this->type){         
         case IMAGETYPE_JPEG: 
            imagejpeg($this->image); 
         break;         
         case IMAGETYPE_GIF: 
            imagegif($this->image); 
         break;         
         case IMAGETYPE_PNG: 
            imagepng($this->image); 
         break;
      }
     imagedestroy($this->image);
   } 
    
   //---Método de redimensionar la imagen sin deformarla 
   function resize($value, $prop){ 
       
      //---Determinar la propiedad a redimensionar y la propiedad opuesta 
      $prop_value = ($prop == 'width') ? $this->width : $this->height; 
      $prop_versus = ($prop == 'width') ? $this->height : $this->width; 
       
      //---Determinar el valor opuesto a la propiedad a redimensionar 
      $pcent = $value / $prop_value;       
      $value_versus = $prop_versus * $pcent; 
       
      //---Crear la imagen dependiendo de la propiedad a variar 
      $image = ($prop == 'width') ? imagecreatetruecolor($value, $value_versus) : imagecreatetruecolor($value_versus, $value); 
       
      //---Hacer una copia de la imagen dependiendo de la propiedad a variar 
      switch($prop){ 
          
         case 'width': 
            imagecopyresampled($image, $this->image, 0, 0, 0, 0, $value, $value_versus, $this->width, $this->height); 
         break; 
          
         case 'height': 
            imagecopyresampled($image, $this->image, 0, 0, 0, 0, $value_versus, $value, $this->width, $this->height); 
         break; 
          
      } 
       
      //---Actualizar la imagen y sus dimensiones 
      $info = getimagesize($name); 
       
      $this->width = imagesx($image); 
      $this->height = imagesy($image); 
      $this->image = $image; 
       
   }    
    
   //---Método de extraer una sección de la imagen sin deformarla 
   function crop($cwidth, $cheight, $pos = 'center') { 
       
      //---Hallar los valores a redimensionar
      $new_w = $cwidth;
      $new_h = ($cwidth / $this->width) * $this->height;
      
      //---Si la altura es menor recalcular por la altura
      if($new_h < $cheight){
         
         $new_h = $cheight;
         $new_w = ($cheight / $this->height) * $this->width;
      
      }
      
      $this->resize($new_w, 'width');
       
      //---Crear la imagen tomando la porción del centro de la imagen redimensionada con las dimensiones deseadas 
      $image = imagecreatetruecolor($cwidth, $cheight); 
       
      switch($pos){ 
          
         case 'center': 
            imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $cwidth) / 2), abs(($this->height - $cheight) / 2), $cwidth, $cheight, $cwidth, $cheight); 
         break; 
          
         case 'left': 
            imagecopyresampled($image, $this->image, 0, 0, 0, abs(($this->height - $cheight) / 2), $cwidth, $cheight, $cwidth, $cheight); 
         break; 
          
         case 'right': 
            imagecopyresampled($image, $this->image, 0, 0, $this->width - $cwidth, abs(($this->height - $cheight) / 2), $cwidth, $cheight, $cwidth, $cheight); 
         break; 
          
         case 'top': 
            imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $cwidth) / 2), 0, $cwidth, $cheight, $cwidth, $cheight); 
         break; 
          
         case 'bottom': 
            imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $cwidth) / 2), $this->height - $cheight, $cwidth, $cheight, $cwidth, $cheight); 
         break; 
       
      } 
       
      $this->image = $image; 
   } 
    
} 
?>

Por: elchininet
Por ahora funciona perfecto! Muchas gracias por tu tiempo!!!

Saludos.
Por: Delfina-blog
HOLA CHICOS COMO LES VA
LES VOY A PEDIR UN FAVOR
ENTREN A ES WEB Y HAGACEN
UN BRUTO ESTA ES LA PAGINA
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
POR FAVOR
Por: Nadia-blog
HOLA CHICOS COMO LES VA
LES VOY A PEDIR UN FAVOR
ENTREN A ES WEB Y HAGACEN
UN BRUTO ESTA ES LA PAGINA
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
POR FAVOR
Por: Nadia-blog
HOLA CHICOS COMO LES VA
LES VOY A PEDIR UN FAVOR
ENTREN A ES WEB Y HAGACEN
UN BRUTO ESTA ES LA PAGINA
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
POR FAVOR
Por: Nadia-blog
HOLA CHICOS COMO LES VA
LES VOY A PEDIR UN FAVOR
ENTREN A ES WEB Y HAGACEN
UN BRUTO ESTA ES LA PAGINA
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
POR FAVOR
Por: Nadia-blog
HOLA CHICOS COMO LES VA
LES VOY A PEDIR UN FAVOR
ENTREN A ES WEB Y HAGACEN
UN BRUTO ESTA ES LA PAGINA
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
http://nadia000.elbruto.es
POR FAVOR
Por: Nadia-blog
@Nadia-blog no está permitido el spam :spam:
Por: elchininet
Nadia, metete tu bruto por el culo
Por: Jaime-blog
me explican como usar esta clase, asi con manzanitas, porke por mas ke lo intento no me resulta... en la pantalla solo aparece :

loadImage('thumbnails01.jpg'); $mythumb->resize(100, 'width'); $mythumb->show(); echo ''; ?>

me ayudan... ???
Por: Zurizadai-blog
Ahora solo consegui que mostrara un cuadrito donde supongo ke debiera mostrarse la imagen. Es una avance, almenos ya no salen letras...

Ayudenme por favor!!

Perdonen mi ignorancia, pero soy un principiante, muy principiante xD.
Por: Zurizadai-blog
¿El tip está descrito paso por paso, en que paso es que tienes problemas?
Por: elchininet
Supongo que no tego problemas con el archivo tumb.php, lo copié tal cual. Luego cree otro archivo image_width_100.php, copy paste de lo que sale. Y cree otro archivo llamado show_image_width_100.php que contiene el codigo:

<?php
echo '<img src="image_width_100.php"/>';
?>

Pero al ejecutar este último archivo, no aparece nada, solo un recuadro de imagen sin nada, como eso que salen en las páginas cuando va una imagen y no se encuetra.

que puede ser??

sé que esta todo muy bien explicado, pero no me resulta!!! (estan todos los archivos en el mismo directorio... )

alguna idea de donde pueda estar el error, quisas es un error que estoy cometiendo yo?
Por: Zurizadai -blog
En el archivo "show_image_width_100.php" debes poner el nombre de tu imagen, la imagen que está puesta es de ejemplo.

Código :

<? 
include_once('thumb.php'); 
$mythumb = new thumb(); 
$mythumb->loadImage('nombre_de_tu_imagen.jpg'); 
$mythumb->resize(100, 'width'); 
$mythumb->show(); 
?>

Por: elchininet
Tendre que descomentar alguna libreria dll o algo por el estilo... esto trabaja con GD?

porque puse una imagen en la carpeta, pero sigue apareciendo el mismo mono, como cuando una imagen no esta disponible... :S

me siento frustrado!!

quiero aprender a utilizar esta claseeeeeeee!!!!!!!!
Por: Zurizadai-blog
¿Que versión de php tiene tu server?
Por: elchininet
Estoy trabajando con un pack llamado Wamp Server 2.0 Tiene:
apache 2.2.11
php 5.2.9-2
mysql 5.1.33

Muchisimas gracias por tu buena disposición! :)
Por: Zurizadai-blog
Con php5 no deberías tener problemas, chequea bien que el nombre de la imagen coincida con el nombre que tienes puesto en el php. Por lo demás no se donde puede estar el problema, es muy fácil de utilizar.
Por: elchininet
Saludos a todos a ver quien me puede ayudar, segui todos los pasos pero solo sale un poco de caracteres en la pagina. tendre que descomentar algo en el .ini
Por: Andres-blog
Te sucede lo mismo que le sucede a @Christian, mira la respuesta.

Si quieres mostrar la imagen directo sin utilizar un php que redimensione y leer a este como una imagen, en el header debes declarar el content-type:

Código :

header('Content-Type: image/jpg');

Por: elchininet
Hola,
Gracias por la clase. La estoy tratando de utilizar pero tengo un problema y no se como resolevrlo. LLamo a al fichero show_image_width_100.php desde un bucle que me hace variar cada vez el nombre de la imagen. Si siempre pongo el mismo nombre, la rutina funciona perfectamente pero si lo tomo desde una base de datos, la imagen no me sale. He comprobado la ortografia del link de conexion y ese no es el fallo. ¿ Puede ser que tenga que ver con la memoria ? ¿ o que el mismo nombre de fichero pueda tener 3 imagenes diferentes en una misma página?

Gracias
Por: ogeretal
Mira esta clase:

http://foros.cristalab.com/clase-de-php-para-crear-galerias-dinamicas-t73470/

La misma utiliza un fichero llamado "show_thumb.php", a este fichero se le pasa por GET la ruta de la imagen, y una medida y este devuelve la imagen, algo como eso es lo que debes hacer. Si miras la clase verás que se utiliza esta misma clase "thumb" y que por medio de un ciclo se crean todos los thumbnails necesarios.
Por: elchininet
Gracias por la info! funciona perfecto! pero tengo un problema, mi página tiene muchas fotos y necesito armar un sistema de paginado, o sea, que por ejemplo cada 16 fotos, pueda pasar a una nueva página, se puede hacer esto utilizando esta clase?
soy nueva y no tengo mucha idea de php...
muchas gracias!!!
Por: agusro
La clase me funciono para lo que necesitaba, pero encontre un bug en la linea 84 dentro de la función "resize"

Código :

function resize($value, $prop){ 
/* 
 *  aca se desarrolla la funcion
*/
 
//---Actualizar la imagen y sus dimensiones 
$info = getimagesize($name);  /// ESTE ES EL PROBLEMA !!!!!!
  
} 


¿de donde salen las variables $info y $name?

info esta claro de que estamos hablando de la variable de clase $this->info , pero $name solo existe como variable en otras funciones, para evitar que apache me arrojase un feo error comente la linea

el sistema esta funcionando perfectamente sin esa linea , pero debe haber algo mas elegante para solucionar esto :P


PD. felicitaciones me sirvio la clase a pesar de todo XD
Por: Inyaka
Gracias @Inyaka por detectar el bug. Esa línea está de más, así que tu solución está perfecta. La línea quedó de un código más antiguo donde actualizaba el ancho y el alto de la imagen dpendiendo de la variable info y para eso pasaba la ruta, al cambiar el código y estos valores actualizarse mediante "imagesx" e "imagesy" ya esa línea estaba de más.

Un saludo y gracias por todo
Por: elchininet
Ha sido detectado un bug en la clase Thumbs. Gracias a Inyaka por el dato.

Un saludo
Por: elchininet
Muchas gracias por la clase, funciona perfecto, había buscado en muchos lugares un script como este. Es muy útil.

Felicitaciones
Por: Rafha01
Hola, estoy tratando de hacer funcionar la clase, pero creo que algo se me ha pasado por alto ya que no funciona correctamente. Me muestra lo que tendrian que ser los thumbs, pero en su lugar esta el recuadro en blanco con aspa roja, sin embargo, cuando pinchas en el, aparece la imagen en cuestion. Y todo esto en IE, ya quew en firefox, me descoloca la pagina por completo y noe muestra nada, ni siquiera los cuadros vacios. En chrome mas de lo mismo.
Lo que yo he hecho para probarla es simplemente incluir las carpetas con las imagenes que venian en el zip, junto con los includes de los css y demas que tambien venian en el zip. Para llamar a la galeria lo hago desde my pagina index, a la que le he agregado el codigo de llamada del fichero index que tu incluias de ejemplo.
espero que me podais ayudar, ya que tengo que implementar una galeria, y tu clase es lo mas que he podido encontrar sin tener que recurrir a metodos mas complicados.
Un saludo y gracias de antemano!!!
Por: jb_script
@jb_script lee un poco mas arriba, hay un bug en la clase pero es facil de solucionar y funciona muy bien despues de eso
Por: Inyaka
Hola Inyaka, el codigo que uso es el que tiene ya el bug corregido, lo acabo de comprobar. Solo consigo que me muestre algo en IE. Y aun asi en IE, tengo el problema de que las imagenes en pequeño, no las muestra.
He seguido paso por paso y no se que puede ser lo que ocurre.
Seguire investigando. Si alguien me puede orientar lo agradecere.
Un saludo!!!
Por: jb_script
primero revisa la carpeta donde debieran llegar las imagenes ¿tiene los permisos en 777? ¿se crean físicamente las miniaturas? ¿estas seguro que la ruta hacia la carpeta contenedora es correcta ? revisa y comentanos

recuerda que la ruta hacia la carpeta de fotos es la ruta del sistema, no la ruta web
Por: Inyaka
Si, se a que te refieres con lo de la ruta. Ahora mismo estoy probando en mi maquina, en la cual tengo un Apache, php y mysql. El caso es que cuando ejecuto mi pagina galeria, me muestra los recuadros de imagen, pero sin ellas, con la aspa roja que aparece en muchas paginas cuando no esta la imagen, pero si le pincho encima, entonces me muestra la imagen a su tamaño. Esto es en IE, ya que en firefox o chrome, directamente no muestra nada y descoloca la imagen.
En mi directorio de imagenes, tengo las imagenes que incluyó el autor de la clase, las que iban en el zip. Tambien he verificado que estoy usando las versiones corregidas, ya que en los post he visto y como me comentabas tu antes, que habia unos errores. El caso es que llevo todo el dia dandole vueltas, y no consigo dar con la solución.
Un saludo y a ver si consigo dar con la solucion, que me esta trayendo de cabeza.
Por: jb_script
la pregunta importante quese te fue es


¿viste la carpeta donde se crean las miniaturas? ¿existen las miniaturas en esa carpeta?

¿tienes la libreria GD instalada?

para saber esto necesitas un archivo php con el phpinfo

Código :

<?php phpinfo(); ?>

Por: Inyaka
Hola, acabo de comprobar, que no crea ninguna miniatura. En cuanto a la libreria gd, la tengo instalada. Esto es lo que me devuelve el phpinfo():
GD Support enabled
GD Version bundled (2.0.34 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.3.9
GIF Read Support enabled
GIF Create Support enabled
JPEG Support enabled
libJPEG Version 6b
PNG Support enabled
libPNG Version 1.2.37
WBMP Support enabled
XBM Support enabled
Por: jb_script
De todas formas, no creo que necesite crearlas, ya que lo que hago es llamar a show_thumb.php para que las muestre redimensionadas, y creo que ahi es donde falla, ya que las miniaturas no las muestra, pero al pinchar en los recuadros vacios si muestra la imagen a tamaño original.
dentro de show_thumb.php tengo esto:
$src = $_GET['src'];
$width = $_GET['width'];
include_once('thumb.php');

$image = new thumb();
$image->loadImage($src);
$image->crop($width, $width);
$image->show();

A este fichero se le llama dentro de la clase gallery.php dentro de la funcion show().
En ningun momento le estoy diciendo que guarde, por lo que creo que lo de que no deje las miniaturas creadas es por eso.
Un saludo.
Por: jb_script
Hola @jb_script, la clase no crea las miniaturas en la carpeta, las lee al vuelo.

Dices que ya has corregido el bug y que lo has comprobado, sin embargo el archivo show_thumb.php que muestras es el primero, no el que se generó después de la actualización, por favor prueba con los archivos nuevos y después postea cualquier problema.

http://foros.cristalab.com/clase-de-php-para-crear-galerias-dinamicas-t73470/30.html#523722
Por: elchininet
@elchininet Muchas gracias por indicarme lo de los nuevos ficheros. Estaba tan fijado en la parte de la pagina donde se comentaba el codigo, que no me fije en que habia un enlace a una nueva version. Ahora si funciona correctamente en los tres navegadores, pero tengo una ultima duda, y es que como sabras, si en windows activas el modo vistas en miniatura, te crea un fichero llamado thumbs.db, y ese fichero, al estar en el directorio de las imagenes, lo esta tomando como una imagen, y lo muestra. Obviamente, no muestra nada, en el recuadro en blanco, y cuando se le pincha tampoco muestra imagen, se queda en un bucle intentando mostrar algo.
Una manera de solventar esto seria borrar este fichero, no?. Ya que solo se utiliza por windows, y generalmente, donde vaya a estar alojado se accedera por ftp, por lo que no creo que tenga mucha utilidad.
Un saludo!!!
Por: jb_script
Es posible redimensionar las imágenes al subirlas al servidor para que de esta forma, no haya problemas al subirlas al server por tamaño, resolucion, etc...? Me explico, tengo un formulario en una página en la que quiero que los usuarios suban imágenes, pero me surge la duda, de que no se como hacer para que al subir la imagen, ésta se convierta a un tamaño/resolución determinado por mí, para evitar que tengan problemas al subir la foto(demasiado grande) o problemas despues de visualización en la web(imagen demasiado pesada). Así independientemente de la imagen que subieran, no tendria que preocuparme puesto que la imagen se adecuará al tamaño que yo le he especificado con anterioridad en el script.
Es posible con esta clase?. Segun he leido en el codigo lo hacemos para los thumbs(miniaturas), pero bien podría valer para imágenes que no sean thumbs. Alguien lo ha usado así, o hay ya solucion a eso y estoy intentando hacer algo rebuscado con esta clase?
Un saludo!!!
Por: jb_script
@jb_script, lo puedes hacer con esta clase, pero primero tendrías que subir la imagen y luego redimensionarla y guardarla como una imagen nueva y de desearlo borrar la antigua.
Por: elchininet
Ok, muchas gracias por las respuestas. Creo que ya se como usarlo para lo que necesito. Realmente es una clase bastante útil y me ha gustado su funcionamiento.
Si tengo alguna duda ya la comentare por aqui.
Mil gracias y hasta el proximo post!!!.
Por: jb_script
Una duda que me ha surgido mientras implementaba la galeria. Yo en un formulario pido un fichero(en este caso la imagen) y lo envio por post al script que lo usa(lo llamo manipularImagen.php). El caso es que no se si puedo trabajar con el fichero .tmp que crea php por defecto, para trabajar sobre el y una vez redimensionada la imagen, entonces ya guardarla en la carpeta de imagenes. Una vez redimensionado este fichero .tmp, necesito hacer un move_uploaded_file para moverlo a la carpeta destino, o simplemente usando la funcion save de thumb.php guardar directamente en la carpeta de imagenes?. Yo hasta ahora, antes de tener la galeria, movia el fichero tmp a la carpeta de imagenes de la web. Ahora con las funciones de la galeria, al poder redimensionar la imagen y poder tratarla, me gustaria saber si es posible trabajar sobre el tmp, y ya el final, moverlo a la carpeta imagenes donde se guardara.
No se si me he explicado bien, si alguien necesita que lo aclare, que me lo indique.
Gracias de antemano!
Por: jb_script
Primero sube el fichero temp al servidor, después lo lees con la clase, redimensionas y guardas la imagen pequeña en una nueva ubicación con los permisos correctos, más tarde si lo deseas borras la imagen original. La clase no puede redimensionar la imagen si esta no se encuentra ya en el servidor.
Por: elchininet
Ok, todo mas claro ahora muchas gracias. Ahora me ha surgido una duda, y es que yo hago esto una vez que cojo la imagen para que me genere una imagen a una dimension especifica, mas que nada para que aunque suban una imagen pesada, esta alfinal ocupe poco en elservidor. Codigo:
...
$image = new thumb();
$image -> loadImage("".$path.$inter.$imagen."");
$image -> resize(500,"width");
$image -> save($path.$inter.$imagen,100);
...

El problema es que las imagenes las guarda a un tamaño menor, (una de las cosas que queria) pero las resoluciones de cada imagen son diferentes para cada una. No deberia de hacerlas todas segun el resize de mi script de 500x500?.
Me he encontrado que al recorrer la galería, éstas son de resoluciones diferentes.
Alguien sabe que le falta al código o que estoy haciendo mal?.
Para mostrar la galeria uso la función loadFolder() de gallery.php para mostrar los ficheros que he ido subiendo. en miniatura todas perfectas, pero el problema surge cuando pincho para ver la foto a tamaño normal, entonces es cuando veo que cada una esta en una resolucion diferente.
Gracias de antemano!!!
Por: jb_script
Lee bien los métodos de la clase, el método resize cambia las dimensiones de la imagen manteniendo sus proporciones, por lo que en imágenes diferentes tendrán igual ancho, pero no igual alto (en el caso específico tuyo que la redimensiones en ancho). Para guardar las imágenes todas a una dimensión deberás utilizar el método crop.
Por: elchininet
si fuerzas una imagen a ser de determinado ancho y alto la imagen pierde sus proporciones, por tanto no es aconsejable, pero puedes cortar las imagenes o tambien puedes ponerle un fondo negro con el cual no se vera una galeria desordenada
Por: Inyaka
Hola, me ha surgido una duda relativa a la funcion show() de gallery.php.
En el ejemplo le pasabas show(500,100,10). Yo pensaba que el 10 (3er parámetro sería para indicar el espaciodo entre imágenes, pero al buscar en gallery.php, me encuentro con que la funcion recibe 500,100,$shownames=False. De donde sale ese $shownames?. Leyendo el código he visto que lo usa para una condición y así mostrar los nombres de las imágenes o no, pero si se le esta pasando un 10, no entiendo lo de ese $shownames.
Todo esto viene a que necesito espaciar mas el espacio que se deja entre imagen e imagen.
Un saludo!!!
Por: jb_script
@jb_script, de nuevo estás confundiendo código, estás utilizando código del primer post (antigua clase) con código de la clase actualizada. Te vuelvo a pasar el link del post actualizado:

http://foros.cristalab.com/clase-de-php-para-crear-galerias-dinamicas-t73470/30.html#523722

Desaparece el espaciado entre las imágenes y el tercer parámetro es true o false para mostrar el nombre de las imágenes.
Por: elchininet
Ok, gracias elchininet por la aclaracion.En explorer me funciona , pero en firefox la galeria no se muestra. Hay algo a tener en cuenta cuando se diseñe una web en cuanto a firefox?. Pensaba que el navegador que mas problemas daba era explorer, pero visto lo visto, y usando codigo estandar, sin funciones propias de explorer, porque falla en firefox???.
Por: jb_script
@jb_script, haz una prueba, intenta visualizar el link de ejemplo del post en firefox, si se te ve bien entonces el problema no está en la galería, debe estar en otro lado. Por otro lado intenta ver tu página en firefox, chrome, safari, opera e internet explorer, si sólo se ve en este último, el problema no es de los demás, si se te ve an algunos si y en otros no puede que sea algún tipo de código no soportado por todos los navegadores.
Por: elchininet
bueno a mi me funciona perfeco
Por: sonplay.com-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.