2010-09-12 34 views
10

Trong PHP manual cho base64_encode() Tôi đã thấy tập lệnh sau để xuất hình ảnh.Đầu ra hình ảnh HTML HTML

<?php 

$imgfile = "test.gif"; 

$handle = fopen($filename, "r"); 

$imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile)); 

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

?> 

Nhưng cách có thể bạn ra một hình ảnh động được tạo ra với GD?

Tôi đã thử điều này:

$im = imagecreatetruecolor(400, 400); 

imagefilledrectangle($im, 0, 0, 200, 200, 0xFF0000); 
imagefilledrectangle($im, 200, 0, 400, 200, 0x0000FF); 
imagefilledrectangle($im, 0, 200, 200, 400, 0xFFFF00); 
imagefilledrectangle($im, 200, 200, 400, 400, 0x00FF00); 

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

Tại sao không làm việc đó?

Có vẻ như hoạt động ở IE nhưng không phải Firefox. Làm thế nào tôi có thể làm cho nó trình duyệt chéo?

+2

Bạn đang sử dụng MSIE? – BalusC

+0

Không, firefox. Hmm, nó hoạt động trong IE ... –

+3

Bạn có thực sự cần sử dụng dữ liệu: URI không? Bởi vì nếu bạn không, tốt hơn là không nên sử dụng chúng. Họ có rất nhiều nhược điểm. IE <8 không hỗ trợ chúng ở tất cả, ví dụ. –

Trả lời

15

Ok, xin lỗi, tôi đã suy nghĩ quá nhanh :)

imagepng() sẽ dữ liệu thô sản lượng dòng trực tiếp cho trình duyệt, vì vậy bạn phải sử dụng ob_start() và đệm đầu ra khác xử lý để có được nó.

Ở đây bạn là:

ob_start(); 
imagepng($yourGdImageHandle); 
$output = ob_get_contents(); 
ob_end_clean(); 

Đó là - bạn cần phải sử dụng $output biến cho bạn base64_encode() chức năng.

+0

Có thể, nhưng không phải anh ta đã làm chính xác điều đó chưa? –

+0

@Tomasz điểm tốt! Đây chính là nó. +1 –

+0

@ Không, anh ấy đúng. Nếu nó hoạt động trong IE, thì vì phần 'img src' bị bỏ qua. Hình ảnh thô sẽ được xuất ra trình duyệt và 'base64_encode' sẽ không bao giờ xảy ra –

1

Rất có thể vì sơ đồ URI data: vô cùng hạn chế và tốt để sử dụng trừ khi hoàn toàn không có cách nào xung quanh nó.

Trong Internet Explorer, ví dụ, tính năng này không hoạt động cho đến IE 8; và trong đó, có một số global 32 kilobyte limitation cho dữ liệu: URI.

+0

Vì vậy, câu nói của bạn làm theo cách khác? –

+0

@Đánh dấu những gì bạn cần dữ liệu: URI cho ở nơi đầu tiên? –

+0

Thử nghiệm hình ảnh xác thực. Xem http: // stackoverflow.com/questions/3692969/captcha-encryption –

0

Bạn phải lưu hình ảnh của mình dưới dạng PNG trước, sau đó đọc từ hình ảnh đó để nhận nội dung dưới dạng giá trị.

http://www.php.net/manual/en/function.imagepng.php

imagepng() không trả lại tệp PNG. Nó đưa nó trực tiếp đến trình duyệt và sau đó trả về thành công hoặc thất bại có nghĩa là boolean.

(từ php.net :) PHP nội bộ hoạt động với tệp tạm thời khi gửi hình ảnh tới trình duyệt, vì vậy bạn sẽ không nhận được gì bằng cách gọi imagepng() hai lần.

+0

Vâng, tôi không muốn lưu dưới dạng hình ảnh nhưng ... –

+1

Bạn có thể đính kèm imagepng() giữa ob_start() và ob_get_contents(); ob_end_clean(); để có được hình ảnh, nhưng nó vẫn sử dụng một tệp tạm thời. –

11

Bởi vì imagepng xuất trực tiếp luồng hoặc luồng hình ảnh trực tiếp ra đầu ra.
Vì vậy, để lấy dữ liệu hình ảnh, bạn nên sử dụng bộ đệm đầu ra như sau:

ob_start(); 
imagepng($im); 
$image = ob_get_contents(); 
ob_end_clean(); 
echo '<img src="data:image/png;base64,'.base64_encode($image).'" />'; 
Các vấn đề liên quan