PHP中的imagepng函數(shù)是一個(gè)非常強(qiáng)大的圖像處理函數(shù),在這個(gè)函數(shù)中,我們可以使用PHP來對(duì)圖片進(jìn)行處理、到處、壓縮等操作。但是有時(shí)候,我們?cè)谑褂胕magepng輸出圖片時(shí),會(huì)出現(xiàn)亂碼的問題。那么這個(gè)問題是如何出現(xiàn)的呢?怎么解決呢?
在使用imagepng輸出圖片時(shí),一般需要提供一個(gè)文件名或句柄參數(shù)。如果我們使用文件名作為參數(shù),那么這個(gè)文件必須存在于服務(wù)器上,并且必須有足夠的權(quán)限進(jìn)行讀寫操作。如果我們使用句柄作為參數(shù),那么這個(gè)句柄必須指向一個(gè)合法的文件或設(shè)備。
例如,我們有一個(gè)php程序,用來生成縮略圖,代碼如下:
$source_file = 'source.jpg'; $dest_file = 'thumbnail.png'; $source = imagecreatefromjpeg($source_file); $dest = imagecreatetruecolor(120, 120); imagecopyresampled($dest, $source, 0, 0, 0, 0, 120, 120, imagesx($source), imagesy($source)); header('Content-Type: image/png'); imagepng($dest, $dest_file, 9); imagedestroy($dest); imagedestroy($source);在這個(gè)例子中,我們使用imagecreatefromjpeg從一個(gè)jpg文件中讀取一個(gè)圖像資源,并創(chuàng)建一個(gè)120x120像素的PNG圖像資源$dest。然后我們使用imagecopyresampled函數(shù)將原圖縮放到$dest中,并使用imagepng將$dest輸出到客戶端,并將縮略圖文件保存在服務(wù)器上。 然而,當(dāng)我們運(yùn)行這個(gè)程序時(shí),我們發(fā)現(xiàn)縮略圖輸出到了屏幕上,但是縮略圖文件卻出現(xiàn)了亂碼。這是為什么呢?原因是我們使用的是文件名作為imagepng函數(shù)的第二個(gè)參數(shù),而這個(gè)文件名是一個(gè)png文件,但是我們又從一個(gè)jpg文件中讀取了圖像資源,這就導(dǎo)致了一個(gè)jpg文件中的二進(jìn)制數(shù)據(jù)被當(dāng)成了png文件的數(shù)據(jù)進(jìn)行了寫入,從而導(dǎo)致了文件的損壞和亂碼。 因此,我們?cè)谑褂胕magepng函數(shù)時(shí),一定要注意好第二個(gè)參數(shù)的類型和內(nèi)容。如果我們要輸出的是一個(gè)文件,那么我們要確保這個(gè)文件存在并且有足夠的權(quán)限進(jìn)行讀寫操作。如果我們要輸出的是一個(gè)流,那么我們需要保證這個(gè)流的格式和類型與我們要輸出的圖像類型相同。 例如,我們可以這樣修改上面的程序來避免輸出亂碼的問題:
$source_file = 'source.jpg'; $dest_file = 'thumbnail.png'; $source = imagecreatefromjpeg($source_file); $dest = imagecreatetruecolor(120, 120); imagecopyresampled($dest, $source, 0, 0, 0, 0, 120, 120, imagesx($source), imagesy($source)); header('Content-Type: image/png'); imagepng($dest); imagepng($dest, $dest_file, 9); imagedestroy($dest); imagedestroy($source);在這個(gè)例子中,我們首先輸出縮略圖到屏幕上,確保不會(huì)出現(xiàn)亂碼的問題,然后再使用imagepng輸出縮略圖文件。由于我們沒有提供文件名作為參數(shù),因此PHP會(huì)將輸出寫入到輸出緩沖區(qū)中,然后使用file_put_contents函數(shù)將輸出保存為指定的png文件。 總的來說,imagepng函數(shù)輸出亂碼的問題是由于我們?cè)谑褂眠@個(gè)函數(shù)時(shí)傳遞了錯(cuò)誤的參數(shù)導(dǎo)致的。如果我們要保證代碼的穩(wěn)定性和可靠性,那么我們一定要嚴(yán)格按照函數(shù)參數(shù)規(guī)范來使用這個(gè)函數(shù)。當(dāng)出現(xiàn)問題時(shí),我們需要仔細(xì)檢查參數(shù)類型和內(nèi)容,從而找到問題的根本原因并解決。