Foros del Web » Programando para Internet » PHP »

PHP y Imagick

Estas en el tema de PHP y Imagick en el foro de PHP en Foros del Web. Hola a todos! Soy nueva por aquí aunque no con nuestro querido PHP, tengo un problema desde hace una semana y no consigo resoverlo, por ...
  #1 (permalink)  
Antiguo 23/04/2012, 09:01
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Información PHP y Imagick

Hola a todos!

Soy nueva por aquí aunque no con nuestro querido PHP, tengo un problema desde hace una semana y no consigo resoverlo, por eso me veo casi obligada a preguntar.

El tema es que me han dicho que tengo que usar imagick para redimensionar imágenes y tras lo que me ha costado instalarlo (horrores) pues veo que el código de php.net no funciona, o funciona a medias. Y tras leerlo mil veces me he dado cuenta de que había algo que se me había pasado por alto.

"Imagick hace que la manipulación de imágenes en PHP sea extremadamente sencilla a través de una interfaz OO." (orientada a objetos?)

¿Que es una interfaz OO?

Por lo pronto, el código que no me funciona es este, extraído tal cual de php.net:
Código PHP:
<?php
header
('Content-type: image/jpeg');
$imagen = new Imagick('imagen.jpg');
// Si se proporciona 0 como parámetro de ancho o alto,
// se mantiene la proporción de aspecto
$imagen->thumbnailImage(1000);
echo 
$imagen;
?>
Da error, "no se puede mostrar la imagen http://localhost" no se por que me dice "localhost" cuando en tal caso debería decir imagen.jpg no?

No se si tiene que ver con eso de "interfaz OO".
En principio imagick está perfectamente instalado pues otras cosas si funcionan.

No me digais de usar GD u otros porque tiene que ser imagick
Sólo necesito redimensionar y mostrar. Debería ser muy sencillo.

Muchas gracias.
  #2 (permalink)  
Antiguo 23/04/2012, 09:48
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: PHP y Imagick

$imagen es un objeto (instancia de Imagick), entonces no puedes hacerle echo directamente, necesitas usar el método getImageBlob(), en el manual hay un ejemplo de uso.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 23/04/2012, 12:19
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: PHP y Imagick

A pesar de tu ayuda no logro que funcione, me devuelve una ristra infinita de caracteres. Cosa que entiendo que pasara con el "echo $imagen" pues ya entendí que ahí no está la imagen en sí sino que la información.

Pero con el getIMageBlob me pasa lo mismo. Lo he puesto mal?

Para más inri me da error de "cabeceras ya enviadas, no se pueden modificar" cuando pongo lo de "header". Estoy en un documento completamente en blanco.

Código:
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\redimensionar\test.php:8)
(en la línea 8 tengo el <?php )

Código PHP:
        header('Content-type: image/jpeg');
        
$image = new Imagick('imagen.jpg');
        
$image->thumbnailImage(1000);
        
$a $image->getImageBlob();
        print 
$a
  #4 (permalink)  
Antiguo 23/04/2012, 16:56
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: PHP y Imagick

Para que la imagen se muestre correctamente, no puedes enviar otro contenido al navegador, un espacio, un salto de línea, letra, número, CUALQUIER CARACTER enviado hará que PHP "piense" que se trata de un documento de texto y enviará los encabezados correspondientes.

En la línea 8 tienes <?php ?... que hay antes de eso?
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 24/04/2012, 08:05
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: PHP y Imagick

Pues antes de eso tengo lo típico claro:

Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<
html>
    <
head>
        <
meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <
title></title>
    </
head>
    <
body

Acabo de hacer otro ejemplo con un script que me he encontrado, lo que copiado y pegado tal cual:
Código PHP:
    <?php
     
    
/* Read the image into the object */
    
$im = new Imagick'strawberry.png' );
     
    
/* Make the image a little smaller, maintain aspect ratio */
    
$im->thumbnailImage200null );
     
    
/* Round corners, web 2.0! */
    
$im->roundCorners5);
     
    
/* Clone the current object */
    
$shadow $im->clone();
     
    
/* Set image background color to black
            (this is the color of the shadow) */
    
$shadow->setImageBackgroundColor( new ImagickPixel'black' ) );
     
    
/* Create the shadow */
    
$shadow->shadowImage8035);
     
    
/* Imagick::shadowImage only creates the shadow.
            That is why the original image is composited over it */
    
$shadow->compositeImage$imImagick::COMPOSITE_OVER0);
     
    
/* Display the image */
    
header"Content-Type: image/png" );
    echo 
$shadow;
     
    
?>
Lo ejecuto tal cual desde el mismo fichero, sin nada antes ni despues. Obtengo el mismo error con los "headers" y la imagen se ve una vez más como ristras de caracteres...

Última edición por alyciashape; 24/04/2012 a las 08:25
  #6 (permalink)  
Antiguo 24/04/2012, 11:16
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: PHP y Imagick

Ok, lo que pasa es que no puedes combinar HTML con imágenes directamente, debes crear otro script para mostrar una imagen a la vez, algo como:

Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2.     <head>
  3.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  4.         <title></title>
  5.     </head>
  6.     <body>
  7.     <img src="script_que_muestra_imagenes.php?imagen=id_de_imagen_1" />
  8.     <img src="script_que_muestra_imagenes.php?imagen=id_de_imagen_2" />
  9.     <img src="script_que_muestra_imagenes.php?imagen=id_de_imagen_x" />

Después, en tu php:
Código PHP:
Ver original
  1. // Imagen a mostrar
  2. if( ! isset($_GET['imagen'])) {
  3.     exit; // No se especificó imagen
  4. }
  5.  
  6. // De alguna forma debes verificar si se trata de una imagen válida
  7. // Ya sea por la id en base de datos, nombre de archivo, etc.
  8.  
  9. $img = $_GET['imagen'];
  10. /* Read the image into the object */
  11. $im = new Imagick( $img );
  12.  
  13. // Continúas con tu proceso normal

El problema que veo con esto es que cada que quieras mostrar la imagen vas a tener que procesarla, espero que no sea muchas veces y no se trate de muchas imágenes, porque podrías consumir en exceso recursos (CPU y memoria) en el servidor.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 24/04/2012, 14:50
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: PHP y Imagick

Muchísimas gracias por tu tiempo.

Pues precisamente quieren usar imagick para ahorrar procesador, si dices que este proceso va a consumir mucho entonces lo haré de otra forma, tras guardar la imagen pues la cargo con un <img src="url_donde_se_guardó"> y ya está, pero me ha servido para aprender unas cuantas cosas igualmente.

Al final he conseguido hacerlo de otra forma mucho más satisfactoria.
La transformación de la imagen la hago en miniatura.php y al terminar la transformación pongo
Header("Content-Type: image/jpeg");
readfile($nombreImagen);

y en el fichero que debo mostrar la imagen
<img src="./miniaturas/miniatura.php?i=muestra.jpg&an=700" />

En este caso especifico sólo el ancho para redimensionar a proporción. Y vualá.
Por si le sirve a alguien.

Última edición por alyciashape; 25/04/2012 a las 05:44 Razón: Nueva solución

Etiquetas: imagick
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 03:47.