2011-03-22 69 views
1

我有一大串base64圖像數據(大約200K)。當我嘗試通過輸出具有正確標題的解碼數據來轉換該數據時,腳本死亡,好像內存不足。我的Apache日誌中沒有錯誤。下面的示例代碼適用於小圖片。如何解碼大圖像?如何將大量的base64圖像數據轉換回帶有PHP的圖像?

<?php 
// function to display the image 

function display_img($imgcode,$type) { 
    header('Content-type: image/'.$type); 
    header('Content-length: '.strlen($imgcode)); 
    echo base64_decode($imgcode); 
} 

$imgcode = file_get_contents("image.txt"); 

// show the image directly 
display_img($imgcode,'jpg'); 

?> 

回答

0

內容長度必須指定實際(解碼的)內容長度,而不是base64編碼數據的長度。

雖然我不知道,修復它會解決這個問題...

+1

這是很好的知道,但是,你是對的,它不能解決問題。 – zvineyard 2011-03-22 14:55:39

2

由於base64 -encoded數據分離乾淨,每4個字節(即3個字節明文編碼爲4個字節的Base64編碼文本),你可以在你的B64字符串分割成4個字節的倍數,並分別對其進行處理:

while (not at end of string) { 
    take next 4096 bytes // for example - 4096 is 2^12, therefore a multiple of 4 
    // you could use much larger blocks, depends on your memory limits 
    base64-decode them 
    append the decoded result to a file, or a string, or send it to the output 
} 

如果你有一個有效的base64字符串,這將等同於工作一次解碼這一切。

+0

這看起來很有希望!你有更好的PHP例子嗎? – zvineyard 2011-03-22 15:00:04

+0

@zvineyard:不是。我會說這可以直接使用'substr()','base64_decode()'和'echo'轉換爲PHP。 – Piskvor 2011-03-22 15:02:13

+0

您如何看待我剛剛發佈的答案? – zvineyard 2011-03-22 15:42:45

1

好的,這是更接近的分辨率。雖然這似乎是以更小的塊來解碼base64數據,但我仍然沒有在瀏覽器中獲得圖像。如果我在放置標題之前回顯數據,我會得到輸出。再次,這與一個小圖像,但不是一個大的作品。思考?

<?php 
// function to display the image 
function display_img($file,$type) { 
    $src = fopen($file, 'r'); 
    $data = ""; 
    while(!feof($src)) { 
     $data .= base64_decode(fread($src, 4096)); 
    } 
    $length = strlen($data); 
    header('Content-type: image/'.$type); 
    header('Content-length: '.$length); 
    echo $data; 
} 

// show the image directly 
display_img('image.txt','jpg'); 
?> 
+0

看起來沒問題。您可能要事先計算圖像長度(IIRC'4/3 * $ encoded_length'),並在收到解碼數據時回顯解碼數據,而不是緩存到'$ data'中。 – Piskvor 2011-03-22 16:12:39

+0

好點。我用您推薦的更改修補了腳本,但仍然沒有獲得圖像。我只能認爲我的base64字符串必須無效。你怎麼看? – zvineyard 2011-03-22 16:17:47

+0

我從帖子中獲取我的base64數據。它需要被urlencoded嗎? – zvineyard 2011-03-22 16:30:09

-1

以base64串保存至使用imagejpeg()或圖像文件的不同格式的正確功能,然後用一個簡單的標籤<img>顯示圖像。

相關問題