2011-12-18 32 views
21

Bueno, mi pregunta es muy simple, solo quiero convertir la salida de imagepng/imagejpg a base64, ¿cómo puedo hacer esto? la forma correcta es con la captura de buffer de salida? Gracias.Convertir la salida de GD a base64

Respuesta

50

imagejpeg/imagepng no devuelve ningún dato, ellos escriben los datos de la imagen directamente en el flujo de salida (o en un archivo).

Si desea capturar esta información codificada como base64, el método más fácil es usar PHPs Output Control Functions, y luego usar base64_encode en el $image_data.

ob_start(); 

    imagejpeg ($img); 
    $image_data = ob_get_contents(); 

ob_end_clean(); 

$image_data_base64 = base64_encode ($image_data); 
4

El caso de uso más común para las imágenes codificadas en base64 es la salida HTML. Me gustaría ofrecer una solución más completa para este caso. También he agregado la capacidad de cambiar los formatos de imagen de salida.

// Example 
$gdImg = imagecreate(100, 100); 
imagecolorallocate($gdImg, 0, 0, 0); 
echo gdImgToHTML($gdImg); 
imagedestroy($gdImg); 

// Create an HTML Img Tag with Base64 Image Data 
function gdImgToHTML($gdImg, $format='jpg') { 

    // Validate Format 
    if(in_array($format, array('jpg', 'jpeg', 'png', 'gif'))) { 

     ob_start(); 

     if($format == 'jpg' || $format == 'jpeg') { 

      imagejpeg($gdImg); 

     } elseif($format == 'png') { 

      imagepng($gdImg); 

     } elseif($format == 'gif') { 

      imagegif($gdImg); 
     } 

     $data = ob_get_contents(); 
     ob_end_clean(); 

     // Check for gd errors/buffer errors 
     if(!empty($data)) { 

      $data = base64_encode($data); 

      // Check for base64 errors 
      if ($data !== false) { 

       // Success 
       return "<img src='data:image/$format;base64,$data'>"; 
      } 
     } 
    } 

    // Failure 
    return '<img>'; 
} 
+0

¿Necesitamos llamar 'imagedestroy ($ gdImg)' o 'ob_end_clean()' se ocupará de eso por nosotros? – user3442612

+0

@ user3442612 Es una buena práctica destruir manualmente las imágenes después de su uso. No creo que sea pertinente para esta muestra corta, pero la agregaré por el bien de hacer las cosas "de la manera correcta". Gracias. – Lachmanski

Cuestiones relacionadas