2011-04-06 32 views
3

我有這個代碼用於在照片上放置透明的PNG圖像水印。只要水印img是PNG-8就可以正常工作(但看起來醜陋與反鋸齒圖像)。如果我使用PNG-24,水印圖像看起來不錯,但會失去透明度。任何方式來解決它?謝謝。PHP和GD:PNG-24透明度問題

CODE:

header('content-type: image/jpeg'); 

$watermark = imagecreatefrompng('wm1.png'); 
$watermark_width = imagesx($watermark); 
$watermark_height = imagesy($watermark); 

imagealphablending($watermark, true); 
imagesavealpha($watermark, true); 
$image = imagecreatetruecolor($watermark_width, $watermark_height); 

$image = imagecreatefromjpeg('image1.jpg'); 
$size = getimagesize('image1.jpg'); 
$dest_x = $size[0] - $watermark_width - 5; 
$dest_y = $size[1] - $watermark_height - 5; 


imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); 
imagejpeg($image, null, 95); 
imagedestroy($image); 
imagedestroy($watermark); 
+0

我出演這篇文章,當我回家時檢查它。我之前和'gd'一起工作過,也有這個問題。我修好了,但我必須檢查腳本,不記得如何。 – Pablo 2011-04-06 20:31:10

回答

4

PNG 24不具有透明層,它只是具有表示紅,綠和藍的3個字節。如果可能,應該使用PNG 32,因爲它具有所需的alpha圖層。

退房此鏈接,明白我的意思:http://www.deepbluesky.com/blog/-/the-difference-between-png24-and-png32_49/

作爲一個側面說明,這行代碼的程序的確毫無作爲$image被打一頓就非常下一行:

$image = imagecreatetruecolor($watermark_width, $watermark_height); 
+0

同樣,在imagecreatefromjpeg之後執行'$ size = getimagesize('image1.jpg');'就是多餘的。 getimagesize不使用GD,所以它再次加載圖像,再次解析它,等等...使用imagesx()和imagesy()來獲取原生GD尺寸信息。 – 2011-04-06 20:56:37

+0

@ohmusama:該行確實有所作爲。它會泄漏內存和資源,因爲直到腳本執行結束時纔會關閉圖像資源... :-D – ircmaxell 2012-03-12 12:01:07

+0

很確實,因爲imagedestroy($ image)在分配下一個之前不會被調用,但是聲明是爲了幫助他從源代碼中刪除該代碼行。 = P 請注意,這是導致php腳本泄漏內存的幾種方法之一。奇怪的類似於c#<_ < – ohmusama 2012-03-16 16:39:46