2012-02-21 31 views
15

Tôi đã tạo một hình ảnh bằng ImagePng(). Tôi không muốn lưu hình ảnh vào hệ thống tệp nhưng muốn xuất hình ảnh đó trên cùng một trang dưới dạng hình ảnh inline mã hóa base64, nhưPHP: tạo hình ảnh bằng ImagePng và chuyển đổi bằng base64_encode trong một tệp?

print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>'; 

không hoạt động.

Có thể thực hiện điều này trong một tệp PHP không?

Cảm ơn trước!

Trả lời

27

Bí quyết ở đây sẽ là sử dụng bộ đệm đầu ra để thu được kết quả từ imagepng(), thao tác này sẽ gửi đầu ra tới trình duyệt hoặc tệp. Nó không trả lại nó phải được lưu trữ trong một biến (hoặc mã hóa base64):

// Enable output buffering 
ob_start(); 
imagepng($png); 
// Capture the output 
$imagedata = ob_get_contents(); 
// Clear the output buffer 
ob_end_clean(); 

print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>'; 

này được chuyển thể từ một ví dụ dùng trong the imagepng() docs.

5

tôi đã cố khi sử dụng các ob_get_contents() khi sử dụng PHP với AJAX, vì vậy tôi đã thử cách này:

$id = generateID(); //Whereas this generates a random ID number 
$file="testimage".$id.".png"; 
imagepng($image, $file); 
imagedestroy($image); 
echo(base64_encode(file_get_contents($file))); 
unlink($file); 

Điều này sẽ lưu tệp hình ảnh tạm thời trên máy chủ và sau đó bị xóa sau khi mã hóa và lặp lại.

0

Nếu bạn không muốn lưu trữ tệp rõ ràng và bạn đang sử dụng ob_start() cho mục khác (vì vậy bạn không thể sử dụng ob_start cho trường hợp này mà không cần phải tái cấu trúc), bạn có thể xác định trình bao bọc luồng của riêng mình một luồng đầu ra cho một biến.

Bạn sử dụng stream_wrapper_register để đăng ký trình bao bọc luồng mới và triển khai phương thức stream_write để ghi vào biến có giá trị bạn có thể truy xuất sau này. Sau đó, bạn chuyển luồng này (thực ra bạn chỉ cần chuyển URI cho luồng này) đến imagepng. imagepng muốn đóng luồng của bạn sẽ không làm phiền bạn, miễn là trình bao bọc luồng của bạn không hủy dữ liệu khi nó được đóng (gọi là phương thức stream_close).

Các vấn đề liên quan