2012-01-10 26 views
8

Estoy tratando de crear una forma de mostrar una imagen creada con PHP/GD, en una forma de OOP. Para lograr eso, creé una clase que, entre otras cosas, crea una imagen. Algo como esto:¿Puedo mostrar una imagen creada con PHP/GD sin guardar y sin usar PHP externo con encabezado de imagen?

<?php 
    class MyClass 
    { 
     public $image; 
     function __construct() 
     { 
      ... 
      $this->image = imagecreatetruecolor(100,100); 
      $bg = imagecolorallocate($this->image,100,100,100); 
      imagefilledrectangle($this->image,0,0,100,100,$bg); 
      ... 
     } 
     ... 
    } 

    $myvar = new MyClass 
?> 

Intenté crear una función dentro de la clase que daría salida a la imagen. Algo como esto:

function show() 
{ 
    echo "<img src='" . imagejpeg($this->image,100) . "' />"; 
} 

pero no funcionó. También probé

function show() 
{ 
    echo "<img src='data:image/jpeg;base64," . imagejpeg($this->image,100) . "' />"; 
} 

pero esto tampoco funcionó. La idea era simplemente llamar a la función desde el HTML. De esta manera:

<div id='anyid'> 
    <?php $myvar->show(); ?> 
</div> 

¿Estoy yendo todo mal en esto? ¿Hay alguna manera de lograr lo que quiero? Traté de pensar en una forma de usar el img = 'mycode.php' pero no me funciona porque la clase debe crearse antes de que la página se cargue y la imagen aparezca a mitad de la página.

Gracias.

+0

Casi lo tenía con show() - solo necesita base64_encode la salida – Aknosis

Respuesta

26

Primero, debe insertar un segundo parámetro en imagejpeg() para permitir que 100 sea el parámetro de calidad. Entonces, es necesario base 64 a codificar los bytes prima:

public function show() { 

     // Begin capturing the byte stream 
     ob_start(); 

     // generate the byte stream 
     imagejpeg($this->image, NULL, 100); 

     // and finally retrieve the byte stream 
     $rawImageBytes = ob_get_clean(); 

     echo "<img src='data:image/jpeg;base64," . base64_encode($rawImageBytes) . "' />"; 

    } 

El data:image/jpeg;base64 requiere los bytes sin formato para conseguir codificados como base 64.

Además, propongo hacer $image una variable $image, ya que supongo que se crea y mantiene únicamente dentro de MyClass.

+0

Gracias SteAp. Lo intenté, pero cuando miro el código html, lo que obtengo es ** ** –

+1

La función imagejpeg() tendrá que ser envuelta con funciones de buffer de salida para capturar el contenido, puede encontrar un archivo llamado "100" que tiene su imagen en la carpeta de su sitio web, imagejpeg() solo puede hacer eco o escribir en el archivo, no devolver :) – Scuzzy

+0

@Scuzzy Mi error. Pase NULL como segundo parámetro para permitir que 100 sea el tercer parámetro. – SteAp

1

Una sola línea de código, solución-me después de 3 horas de búsqueda ciega!

... 
ob_start(); 
header("Content-type: image/jpeg"); <br/> 
imagejpeg($this->img, NULL, $qualidade);<br/> 
imagedestroy($this->img);<br/> 
$i = ob_get_clean();<br/> 

echo "<img src='data:image/jpeg;base64," . base64_encode($i)."'>"; //saviour line! 

thks!

Cuestiones relacionadas