[英]PHP - Watermark PNG Transparency/Alpha
我知道這已經被覆蓋了很多次,但我一直在嘗試不同的腳本並修改我的腳本,我仍然無法讓我的PNG-24 watermark.png在我父圖像的頂部透明。
這就是我目前所擁有的:
<?
header('content-type: image/jpeg');
$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatefromjpeg($imageURL);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$size = getimagesize($imageURL);
imagealphablending($image, false);
imagesavealpha($image, true);
$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);
imagedestroy($image);
imagedestroy($watermark);
?>
我剛剛閱讀了另一個SO問題,其中一個答案建議如果你不添加這兩行就不會透明:
imagealphablending($image, false);
imagesavealpha($image, true);
我添加了它們但仍然沒有。 我嘗試將標題和輸出設置為PNG,但仍然沒有運氣。 我在瀏覽器中加載了水印(原始),它絕對是透明的,但不是在圖像上。 當然這不是那么難嗎? 我有什么想法我做錯了嗎?
這不是應用程序代碼的問題,而是水印圖像(PNG)本身。
許多水印示例/教程都說使用PNG-24水印,但根據我剛剛閱讀的博客,他們說imagecopymerge
不能很好地處理PNG-24文件,因此,使用PNG-8和一些特殊的“保存為Web”設置。 我這樣做了,現在工作正常。
以下是此博客中有關PNG類型的相關部分:
水印圖像應采用以下建議格式之一:
- PNG-8(推薦)
顏色:256或更少
透明度:開/關- GIF
顏色:256或更少
透明度:開/關- JPEG
顏色:真實的顏色
透明度:不適用imagecopymerge功能無法正確處理PNG-24圖像; 因此不建議這樣做。
如果您使用Adobe Photoshop創建水印圖像,建議您使用“Save for Web”命令並使用以下設置:
File Format: PNG-8, non-interlaced Color Reduction: Selective, 256 colors Dithering: Diffusion, 88% Transparency: On, Matte: None Transparency Dither: Diffusion Transparency Dither, 100%
而對於其他的好處,這是我有的水印代碼:
<?
$masterURL = 'mydomain.com/myImage.jpg';
header('content-type: image/jpeg');
$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$image = imagecreatefromjpeg($masterURL);
$size = getimagesize($masterURL);
$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);
imagedestroy($image);
imagedestroy($watermark);
?>
經過多一點閱讀(對同一篇文章的評論 ),我發現你可以使用PNG-24水印,但使用imagecopy
而不是imagecopymerge
。 你可以替換這一行:
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);
這一個:
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
使用帶有PNG-8水印的imagecopymerge
非常適合“即時”水印,因為水印文件很小。 如果你對'幕后'加水印,那么文件大小並不重要,你可以使用imagecopy
從PNG-24水印中獲得更好的質量。
我希望這有助於混亂的水上運動員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.