Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Clase para redimensionar imagenes

Estas en el tema de Clase para redimensionar imagenes en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, he creado una clase para redimensionar imagenes usando los binarios de NetPBM. Si, ya se lo que algunos estan pensando xD (otra clase más!?!). ...
  #1 (permalink)  
Antiguo 05/08/2007, 09:14
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Clase para redimensionar imagenes

Hola,

he creado una clase para redimensionar imagenes usando los binarios de NetPBM. Si, ya se lo que algunos estan pensando xD (otra clase más!?!). Lo siento, no lo pude evitar jeje.

Mis razones fueron que las apis existentes no me convencieron y que ImageMagick no esta disponible en todos los hosts. (Hay estudios de desempeño o performance que ponen a IM como el programa más rapido).

Si tienen un proyecto en donde necesiten redimensionar imagenes, generar mini-fotos o thumbnails cuadrados o con medidas específicas; tal vez esta clase sea útil.

Se agradece cualquier comentario o sugerencia.

Descargar: https://sourceforge.net/projects/netpbmresize/
Sitio web del proyecto: http://netpbmresize.sourceforge.net
Binarios de Netpbm para Windows/Linux: http://tinyurl.com/25daoc


Saludos.
  #2 (permalink)  
Antiguo 05/08/2007, 13:53
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Clase para redimensionar imagenes

gracias, se ve buena tu clase, la voy a descargar y probar.

salu2
  #3 (permalink)  
Antiguo 05/08/2007, 22:51
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Hola,

gracias, de momento me esta sirviendo a mi, pero sería excelente que fuera útil para todos. xD Cualquier comentario o duda, bienvenidos.

Saludos.
  #4 (permalink)  
Antiguo 06/08/2007, 10:17
Avatar de asinox  
Fecha de Ingreso: enero-2002
Ubicación: Santo Domingo
Mensajes: 2.712
Antigüedad: 22 años, 3 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Gracias man, se te agradece, creo que deberian colocarla en la FAQ
__________________
www.dataautos.com
  #5 (permalink)  
Antiguo 07/08/2007, 17:22
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 2 meses
Puntos: 11
Re: Clase para redimensionar imagenes

Excelente k4k4, te felicito, muy bien presentado!

Conoces la clase para manipular imagenes de Stefan Gabos (Zebra framework)? Me gustan las clases que desarrolla Stefan, la que manipula imágenes utiliza la libraria GD.

Por ahora siempre use ImageMagik y hace mucho GD, pero siempre viene bien contar con una clase que soporte NetPBM.

Gracias por compartir, y me encanto el sitio!
  #6 (permalink)  
Antiguo 07/08/2007, 18:36
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Hola Tukzone,

muchas gracias por tus comentarios ya estoy revisando la clase del Zebra framework (especialmente los ejemplos).

Algunos estudios de desempeño o benchmarking que he leído siempre ponen a ImageMagick como la mejor opción tanto en calidad como en rapidez, en esta url se puede ver un estudio detallado: http://www.baschny.de/graphic-test/.

Así que terminaré haciendo una adaptación para poder usar ImageMagick aunque tratando todavía de lograr una API clara, concisa, bonita. xD

Como menciono anteriormente, se aceptan comentarios/sugerencias sobre el código o en dado caso que se atrevan a usarla xD y tengan problemas comenten.

Saludos.
  #7 (permalink)  
Antiguo 08/08/2007, 11:03
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 2 meses
Puntos: 11
Re: Clase para redimensionar imagenes

k4k4, tengo una clase que desarrolle para trabajar con ImageMagik y modifique la de Stefan que usa la libreria GD. O sea, en mi framework tengo la siguiente estructura:

Código:
 
- Image/
       Gd.php
             Magik.php
Image.php

Y funiona de esta manera:

Código PHP:
$thumbnailImageTag Image::getThumbnail('path/''test.jpg''120x90'); 
...o...

Código PHP:
$thumbnailImageUrl Image::getThumbnail('path/''test.jpg''120x90''url'); 
Referencia:

Código:
getThumbnail($folder_path, $image_name, $image_dimensions [, str tag_or_url [, str alt_text]])
Image.php es una clase estática que carga el objeto que va a procesar la imagen en base a la configuración del usuario (también puede autodetectar).

Me gustaria mostrarte esto para que veas si podemos de alguna manera hacer algo que incluya también GD.

Muy buen trabajo, te felicito nuevamente.
  #8 (permalink)  
Antiguo 08/08/2007, 11:43
 
Fecha de Ingreso: septiembre-2006
Mensajes: 1.193
Antigüedad: 17 años, 7 meses
Puntos: 30
Re: Clase para redimensionar imagenes

hola tengo una duda, primero quiero que veas esta galeria http://www.informaticaunam.com.mx/di...a/diegogal.swf es una galeria personal ya que ando aprendiendo a usar el nuevo lenguaje de flash y decidi hacerla , pero tengo un problema, yo hago de la foto original una mas pequeña con php, pero no se si tu clase pueda hacer la imagen principal dependiendo de la altura y anchura del rectangulo negro donde se ven mis fotos, es decir yo hago eso, pero todas mis imagenes se ven a 400 x 300, y por esta razon se ven algunas deformadas, osea quiero saber si tu clase puede hacer esto si que se vean deformadas.
  #9 (permalink)  
Antiguo 08/08/2007, 12:43
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 2 meses
Puntos: 11
Re: Clase para redimensionar imagenes

Tambien tenes la clase de PEAR, Image_Transform, pero realmente no es muy practica. Lo que si soporta GD, ImageMagick, Imagick y NetPBM. Aunque de esta clase podemos sacar algunas ideas y un poco de codigo.

Estuve viendo la tuya y no estaría mal organizarla de otra manera, ejemplo:

Código:
- Image/
    Info.php
    Gd.php
    Magik.php
    Imagik.php
    Netpbm.php
Image.php
Lo que antes era ImageInfo, se convierte en Image_Info (Info.php).

Image (Image.php) es la que toma el control y crea una instancia del objeto que necesita.
  #10 (permalink)  
Antiguo 08/08/2007, 14:35
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Hola Rizzo,

actualmente esta clase puede redimensionar a un tamaño específico con el método resizeByDimensions(), pero para evitar la deformación hace primero un corte de la imagen tomando la parte central. Es por esta razón, que este método lo uso para crear thumbnails también.

La única forma para que no se pierda información de la imagen es que la original tenga la misma tasa de ancho/alto que la medida a la que quieres redimensionar o dicho de otra manera, que el ancho y alto original sean múltiplos del ancho y alto deseados.

Ejemplo:
Código:
Dimensión deseada: 400 x 300

Dimensión original: 800 x 600 o 1200 x 900, y así sucesivamente.
Estuve pensando en modificar el método para que en lugar de tomar la parte central, tome el extremo superior, inferior, derecho o izquierdo xD


Tukzone,

definitivamente esa sería una estructura posible sólo que tal vez tenga que cambiar de nombre al proyecto xD También, para una siguiente version planeo hacer uso de todo lo que PHP5 ofrece, específicamente, __call(), __set, __get. Creo que primero daré prioridad a ImageMagick o a su alternativa más estable: GraphicMagick.


Saludos y gracias por sus comentarios.
  #11 (permalink)  
Antiguo 08/08/2007, 20:59
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Por cierto, otro método menos exacto es resizeByBoundingBox() que ajusta una imagen a una caja de ciertas dimensiones (400x300) sin distorsionarla, pero no garantiza que la imagen ocupará todo el ancho o todo el alto de esa caja.

Cualquier duda, comentario o sugerencia: bienvenidos!


Saludos.
  #12 (permalink)  
Antiguo 14/08/2007, 16:25
 
Fecha de Ingreso: septiembre-2006
Mensajes: 1.193
Antigüedad: 17 años, 7 meses
Puntos: 30
Re: Clase para redimensionar imagenes

tengo una duda:

ya baje el archivo netpbmresize.class.php

vi en la pagina que ponen unos ejemplos entonces elegi este:

Código PHP:
  <?php
 
    
// $Images contains all the uploaded photos in a nicely formatted array

  
$Images getFileUploadArray();
  
   require_once 
PATH_TO_CLASS 'netpbmresize.class.php';

    
$netpbm =& new NetpbmResize('/path/to/binaries''/my/working_dir');
  
    

    foreach (
$Images as $Image) {

    
$netpbm->resize(75$Image['name']);

    }

    
?>
aqui en la parte de /path/to/binaries, que se supone que debo poner?, ahi va otro archivo? otra carpeta de donde la bajo?

Código PHP:
  $netpbm =& new NetpbmResize('/path/to/binaries''/my/working_dir'); 
  #13 (permalink)  
Antiguo 14/08/2007, 23:22
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Hola,

en esa parte va la ruta donde colocaste los programas de Netpbm. Estos programas los puedes bajar de aquí.

Actualmente, la ruta debe de ir sin diagonal al final. Por ejemplo: "/home/domains/miweb/bin" en lugar de "/home/domains/miweb/bin/". Esto cambiará en el futuro y se podra ingresar la ruta de cualquiera de las 2 formas.

Saludos.
  #14 (permalink)  
Antiguo 22/08/2007, 17:21
 
Fecha de Ingreso: septiembre-2006
Mensajes: 1.193
Antigüedad: 17 años, 7 meses
Puntos: 30
Re: Clase para redimensionar imagenes

tengo una carpeta que se llama galeria007 ahi coloque una carpeta que se llama netpbm del link que me diijste donde estan los archivos binarios, tambien en galeria007 tengo otra carpeta donde estan las fotos llamada fotos entonces ahi tambien en la carpeta galeria007 esta mi archivo de ejemplo y tengo esto:

Código:
 <?php
 
    // $Images contains all the uploaded photos in a nicely formatted array

  $Images = getFileUploadArray();
  
   require_once PATH_TO_CLASS . 'netpbmresize.class.php';

    $netpbm =& new NetpbmResize('/netpbm', '/fotos');
  
    

    foreach ($Images as $Image) {

    $netpbm->resize(75, $Image['name']);

    }

    ?>
y me aparece este error.

Cita:
Fatal error: Call to undefined function getFileUploadArray() in C:\AppServ\www\ejemplos\galeria007\archivo.php on line 6
en la line6 tengo esto:

Código:
  $Images = getFileUploadArray();
me podrias dar un ejemplo en el cual al correr el codigo me salga una imagen mas chica por favor ya que no entiendo mucho que puede estar mal. gracias.
  #15 (permalink)  
Antiguo 23/08/2007, 11:19
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Hola,

lo que sucede es que esa función es también un ejemplo. xD

En este caso, lo que realiza esa función es convertir el arreglo de imagenes subidas a un arreglo formateado convenientemente para usarlo con un ciclo foreach.

Hmm, no se que tanta experiencia tengas en PHP, pero aquí te va un ejemplo deduciendo que lo que tu quieres hacer es redimensionar las imagenes que ya están en tu carpeta fotos.

Esto podría estar en tu archivo de ejemplo:
Código PHP:
// primero obtengo la ruta base, como estás en windows concateno esa diagonal
$ruta dirname(__FILE__) . '\\';
$ruta_fotos $ruta 'fotos';

// suponiendo que pusiste la clase en el mismo directorio que este archivo
require_once 'netpbmresize.class.php';

// instancio un objeto de la clase NetpbmResize (omite la '&' si estas en php5)
$netpbm =& new NetpbmResize($ruta 'netpbm',  $ruta_fotos);

/*
  ahora tengo aque sacar toda la lista de imagenes que ya tienes leyendo ese directorio
 Para esto usaré la función ubicada aquí: http://www.laughing-buddha.net/jon/php/dirlist/
 Ten en cuenta que si tienes subdirectorios, éstos aparecerán también en el arreglo así que es posible que tengas que modificar la función dependiendo de como organizaste tus fotos
*/
$fotos dirList($ruta_fotos);

// ahora procedo a iterar sobre el arreglo y redimensionar cada imagen
foreach ($fotos as $foto) {
    
$netpbm->resize(75$foto);

recuerda que la imagen será guardada en el mismo directorio y por default tendrá el sufijo ".rs" xD éste lo puedes cambiar con el método setSuffix()

Espero que esto te ayude a resolver tu problema.

Algo muy importante si efectivamente lo que quieres es redimensionar fotos que ya están en tu pc tal vez puedas probar este programa http://www.fookes.com/ezthumbs/index.php esta bastante bien. Aunque no tiene los algoritmos que maneja los métodos squareThumbnail() o resizeByDimensions().


Saludos.

Última edición por k4k4; 23/08/2007 a las 14:56 Razón: Un error en el código; variable incorrecta. >.>
  #16 (permalink)  
Antiguo 23/08/2007, 14:23
 
Fecha de Ingreso: septiembre-2006
Mensajes: 1.193
Antigüedad: 17 años, 7 meses
Puntos: 30
Re: Clase para redimensionar imagenes

asi lo puse:

Código PHP:
<?
// primero obtengo la ruta base, como estás en windows concateno esa diagonal
$ruta dirname(__FILE__) . '\\';
$ruta_fotos $path 'fotos';
require_once 
'dirlist.php';
// suponiendo que pusiste la clase en el mismo directorio que este archivo
require_once 'netpbmresize.class.php';

// instancio un objeto de la clase NetpbmResize (omite la '&' si estas en php5)
$netpbm = new NetpbmResize($ruta 'netpbm',  'fotos');

/*
  ahora tengo aque sacar toda la lista de imagenes que ya tienes leyendo ese directorio
 Para esto usaré la función ubicada aquí: [url]http://www.laughing-buddha.net/jon/php/dirlist/[/url]
 Ten en cuenta que si tienes subdirectorios, éstos aparecerán también en el arreglo así que es posible que tengas que modificar la función dependiendo de como organizaste tus fotos
*/
$fotos dirList($ruta_fotos);

// ahora procedo a iterar sobre el arreglo y redimensionar cada imagen
foreach ($fotos as $foto) {
    
$netpbm->resize(75$foto);

?>
y me saca esto:

Código:
Fatal error: NetpbmResize Error: Error at netpbm execution, full command line: C:\AppServ\www\ejemplos\galeria007\netpbm\jpegtopnm fotos\37a5134d987f2fea.jpg | C:\AppServ\www\ejemplos\galeria007\netpbm\pnmscale -xysize 75 75 | C:\AppServ\www\ejemplos\galeria007\netpbm\pnmtojpeg --quality=95 > fotos\37a5134d987f2fea.rs.jpg in C:\AppServ\www\ejemplos\galeria007\netpbmresize.class.php on line 511
saca los nombres de las fotos pero dice NetpbmResize Error: Error at netpbm execution, como ves?
  #17 (permalink)  
Antiguo 23/08/2007, 14:45
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

El directorio de trabajo debe ser una ruta absoluta. Checa como lo puse en mi ejemplo:
Código PHP:
$netpbm =& new NetpbmResize($ruta 'netpbm',  $ruta_fotos); 
y como lo tienes:
Código PHP:
$netpbm = new NetpbmResize($ruta 'netpbm',  'fotos'); 
Creo que con eso ya se podrá hacer la redimensión de las fotos.


Saludos.
  #18 (permalink)  
Antiguo 23/08/2007, 14:55
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Ah otra cosa.. xD tengo un error en mi código de ejemplo que a la mejor ya descubriste.

En lugar de:
Código PHP:
$ruta dirname(__FILE__) . '\\'
$ruta_fotos $path 'fotos'
debe ser:
Código PHP:
$ruta dirname(__FILE__) . '\\'
$ruta_fotos $ruta 'fotos'
Voy a corregir el post también xD sorry!
  #19 (permalink)  
Antiguo 24/08/2007, 11:43
 
Fecha de Ingreso: septiembre-2006
Mensajes: 1.193
Antigüedad: 17 años, 7 meses
Puntos: 30
Re: Clase para redimensionar imagenes

ya quedo
Código PHP:
 <?
// 
$ruta dirname(__FILE__) . '\\';


// 
require_once 'netpbmresize.class.php';

// 
$netpbm = new NetpbmResize($ruta .'netpbm','foto.jpg');





    
$netpbm->resize(80);


?>
mira en la carpeta galeria007 puse los binarios netpbm y coloque mi foto.jpg y rambien la clase netpbmresize.class.php

al probarlo me aparece la imagen con extencion .rs, tu decias que queria hacer pekeñas fotos para mi maquina pero no, aqui ando probando pero la idea es subir el script en la web.

ahora tengo otra duda.

como hago para que en el html esa imagen la genere en un html y la vea en el navegador por ejemplo


Código:
<html>
<body>

<IMG SRC="flashruta.php?mifoto=foto.jpg&escala=200">

</body>
</html>
yo ahora pongo asi el codigo para asignar en el html los valores mifoto y escala pero no funciona como ves? sabes que hago mal:
Código PHP:
<?
// 
$ruta dirname(__FILE__) . '\\';


// 
require_once 'netpbmresize.class.php';
//

$netpbm = new NetpbmResize($ruta .'netpbm',$mifoto);





    
$netpbm->resize($escala);


?>
gracias.
  #20 (permalink)  
Antiguo 24/08/2007, 12:03
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Clase para redimensionar imagenes

Hmm, me parece que esa pregunta ya no corresponde a el manejo de la clase sino más bien a tu aplicación. xD

La clase redimensiona imagenes, ya has visto algunos ejemplos. Ahora sólo es cuestión de armar las piezas del rompecabezas. Una pista: cuando en el atributo SRC de la etiqueta IMG incluyes un script php, en éste tienes que tener, generalmente, algun tipo de encabezados HTTP para definir que tipo de archivo vas a mostrar. En mi humilde opinión, es complicarse un poco la vida. xD

Como sugerencia, no es prudente estar redimensionando en el momento que un usuario visita la página (se puede mejorar haciendo una especie de cache para las fotos redimensionadas). Es muy probable que sea mejor redimensionar "antes" y presentar las opciones con las diferentes dimensiones. Pero, todo depende de que quieras hacer.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:13.