2010-01-15 267 views
27

是否有可能從二進制數據重新創建圖像(如果需要,處理它們)並將它們顯示在同一個腳本中?喜歡的東西php:從二進制數據重新創建並顯示圖像

// get and display image 1: 
$imagedata1 = file_get_contents('assets/test.png'); 
$imagedata1 = process_using_gd_or_something($imagedata1); 

echo "<img src={$imagedata1} >"; // <-- IS THIS (OR EQUIVALENT) POSSIBLE? 

// get and display image 2: 
//etc... 

我想避免的圖像存儲到磁盤處理後,並從那裏得到他們,或使用一個外部腳本...

+3

圖像* *是二進制數據! – pavium 2010-01-15 09:47:30

+0

好點! :-) – Cambiata 2010-01-15 09:56:14

回答

55

您可以使用圖像src屬性中的數據URI來執行此操作。

格式爲:data:[<MIME-type>][;charset="<encoding>"][;base64],<data>

這個例子是直接從Wikipedia page on data URIs

<?php 
function data_uri($file, $mime) 
{ 
    $contents = file_get_contents($file); 
    $base64 = base64_encode($contents); 
    return ('data:' . $mime . ';base64,' . $base64); 
} 
?> 

<img src="<?php echo data_uri('elephant.png','image/png'); ?>" alt="An elephant" /> 
+4

+1使用正確的術語*數據URI * – Gordon 2010-01-15 09:50:06

+0

謝謝你本!正是我需要的! – Cambiata 2010-01-15 10:00:15

+0

請注意,並非所有瀏覽器都會正確呈現數據URI。確保你測試得很好... – ircmaxell 2011-06-03 11:36:21

21

這實際上是可以利用內嵌圖像(稱爲data URI小號)。

你的形象標籤將是這個樣子:

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/ 
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp 
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" 
width="16" height="14" alt="embedded folder icon"> 

爲什麼他們大多不是一個好主意:

  • 頁負荷將放緩因爲形象的需要被提取之前可以加載完整的HTML結構並進行渲染。如果您對圖像執行其他操作,則更是如此。如果您的網站是外部圖片,您的網站可能會感覺非常慢。

  • 嵌入式圖像需要base64編碼,的大小增加33%。

如果你在談論一個合理的高流量的公共站點,我會建議你在外部存儲你的圖像,並緩存它們。如果只是一個小項目,內聯圖片可能適合你。

+1

+1列出缺點。作爲一個經驗法則,這種技術應該用於相對較小(尺寸方向)的圖像,例如, W3驗證器上的圖標指示器:http://validator.w3.org/check?uri=http%3A//stackoverflow.com/questions/2070603/php-recreate-and-display-an-image-from-binary-數據 – jensgram 2010-01-15 09:50:48

+0

謝謝佩卡! StackOverflow和(它的用戶)規則! – Cambiata 2010-01-15 10:01:52

3

其他可能對你來說是創建一個腳本中的圖像數據生成到輸出和直接鏈接到它。

image.php

$imagedata1 = file_get_contents('assets/test.png'); 
$imagedata1 = process_using_gd_or_something($imagedata1); 

header('Content-type: image/png'); 
echo $imagedata1; 

other_pages.php:

echo "<img src='image.php?some_params'>"; 

編輯: 對不起,我錯過了不想外部腳本的通知,但這個解決方案比編碼更有效圖像到base64。

1

如果你只是想形象,周圍沒有任何的HTML,你可以使用以下命令:

$filename = 'assets/test.png'; 
$original_image = file_get_contents($filename); 
$processed_image = process_the_image_somehow($original_image); 

header('Content-type: '.mime_content_type($filename)); 
header('Content-Length: '.strlen($processed_image)); 
echo $processed_image; 

你不應該忘記的Content-Length頭,否則將無法正常工作。 您可能還想根據文檔取代mime_content_type(),因爲它已被棄用。

4

嘗試......

$img=base64_encode($row['PICTURE']); 

<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/> 
相關問題