簡體   English   中英

PHP - 水印PNG透明度/ Alpha

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM