2011-12-18 9 views
21

Vâng, câu hỏi của tôi rất đơn giản, tôi chỉ muốn chuyển đổi đầu ra của imagepng/imagejpg thành base64, làm cách nào tôi có thể thực hiện việc này? một cách chính xác là với chụp bộ đệm đầu ra? cảm ơn.Chuyển đổi đầu ra GD thành base64

Trả lời

50

imagejpeg/imagepng không trả lại bất kỳ dữ liệu nào, chúng ghi dữ liệu hình ảnh trực tiếp vào luồng đầu ra (hoặc tệp).

Nếu bạn muốn nắm bắt dữ liệu này được mã hóa dưới dạng base64, phương pháp dễ nhất là sử dụng PHP Output Control Functions và sau đó sử dụng base64_encode trên $image_data.

ob_start(); 

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

ob_end_clean(); 

$image_data_base64 = base64_encode ($image_data); 
4

Trường hợp sử dụng phổ biến nhất cho hình ảnh được mã hóa base64 là đầu ra HTML. Tôi muốn cung cấp một giải pháp hoàn chỉnh hơn cho trường hợp này. Tôi cũng đã thêm khả năng chuyển đổi định dạng hình ảnh đầu ra.

// 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

Chúng ta có cần gọi 'imagedestroy ($ gdImg) 'hoặc' ob_end_clean() 'có quan tâm đến điều đó cho chúng ta không? – user3442612

+0

@ user3442612 Thực hành tốt là tự hủy hình ảnh sau khi sử dụng. Tôi không tin rằng nó phù hợp với mẫu ngắn này, nhưng tôi sẽ thêm nó cho mục đích làm những điều "đúng cách". Cảm ơn. – Lachmanski