2013-10-21 56 views
1

問題:PHP imagejpeg()顯示奇怪的字符

我發現這個簡單的腳本解釋如何使用imagejpeg():

<?php 
$im = imagecreatetruecolor(120, 20); 
$text_color = imagecolorallocate($im, 233, 14, 91); 
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color); 
header('Content-Type: image/jpeg'); 
imagejpeg($im); 
imagedestroy($im); 
?> 

當我複製/粘貼在一個空的PHP文件它工作得很好。我顯示一個圖像。

現在,當我插入此代碼到格式化爲我現有的PHP文件之一如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 
<body> 

***code above*** 

</body> 
</html> 

它不返回任何圖像。只是一些奇怪的角色。

我想會發生什麼:

我讀其他職位,我認爲這個問題是來自我的主頭「的Content-Type」。但我不明白爲什麼嵌入代碼中的'Content-Type:image/jpeg'不會取代主標題中寫入的內容?它應該告訴imagejpeg()顯示圖像,而不是文本...

有誰知道如何解決它?謝謝。

回答

2

這是因爲它返回圖像數據就好像您將圖像文件包含爲文本一樣。對於HTML顯示圖像存在img元素:

<img src="myimage.php" alt="Pretty, isn't it?"> 

你也應該得到那個頭不能被修改,因爲他們已經發出警告,這應該提醒你的是你在做什麼是..奇怪最好。

將代碼返回到一個單獨的PHP文件中的圖像,或者確保在調用時獲得一個HTML頁面返回一個JPEG圖像。混合這兩個並不是一個好主意。

+0

非常感謝。其實我正在使用這種方法,但我認爲有一種方法可以做不同的事情......例如使用php函數。 – Guillaume

+0

...我不太喜歡用這個方法建議的是,當你想要傳遞變量時,它變得非常不雅。假設你想通過GET_變量指示圖像的寬度,質量,圖像路徑,對嗎?所以它看起來像這樣:這麼重......只是調用一個php函數會更好。非常傷心,它不能做... – Guillaume

+0

那麼,你可以使用其他方法,例如,引用圖片爲'/ picfolder/500/80/foo.jpg',並使用404錯誤處理程序創建圖像並在不存在的情況下提供圖像。我們使用這種方法獲得更好的URL並在多年前的瀏覽器遊戲中自動生成緩存的圖像。 – Joey

0

您不能簡單地將PHP代碼嵌入到HTML文檔中併發出圖像 - 瀏覽器期待HTML而不是圖像數據。您從PHP腳本發出的內容類型標題實際上並未發送,因爲到達腳本的一部分時,標題已經發送。您的新標題只是被丟棄,並且會向您的服務器日誌添加警告。

爲了使這項工作包括在HTML文檔中的HTML圖像代碼,並使用你的PHP腳本爲src屬性:

<body> 
    <img src="myPHPScript.php"> 
</body> 

你可以申請你需要的任何額外的造型給它,就像使用任何其他圖像。

1

你也可以這樣做。

<?php 

    $im = imagecreatetruecolor(120, 20); 
    $text_color = imagecolorallocate($im, 233, 14, 91); 
    imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color); 

    ob_start(); 

    imagejpeg($im); 
    imagedestroy($im); 

    $data = ob_get_contents(); 

    ob_end_clean(); 

    $image = "<img src='data:image/jpeg;base64,".base64_encode ($data)."'>"; 
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 
<body> 

<?php echo $image; ?> 

</body> 
</html> 

適合我。

+1

'imagejpeg'雖然可能不會像PNG那樣返回圖片數據。對於較大的圖像(JPEG通常是幾百KiB)我會說數據URI不是最好的選擇。 – Joey

+0

ops!讓我mod的.. ..謝謝..順便說一句..我有這個在驗證碼類運行..在PNG/JPEG中的作品奇蹟..但我總是pref PNG :) – xlordt

2

調用imagejpeg(前加入這一行)

header('Content-Type: image/jpeg'); 

這告訴你正在顯示圖像而不是HTML瀏覽器。

+0

對不起,我有同樣的問題,但由於另一個原因所以我認爲你有同樣的問題,直到我提交答案,我才意識到這一點。 –