<p>一般我们使用imagecopymerge设置透明度无法正确解析png图片,由于png文件的透明背景没有被正确处理导致的。在处理png文件时,需要使用imagecolortransparent()函数将透明颜色设置为图像的透明色。</p><p>以下是修改后的代码示例:</p><div class="sourceCode"><pre class="sourceCode php"><code class="sourceCode php"><a href="#cb1-1"></a><span class="co">// 载入原始图片和水印图片</span><a href="#cb1-2"></a><span class="va">$source_image</span> <span class="op">=</span> <span class="fu">imagecreatefromjpeg</span>(<span class="st">'death-valley-3133502_1280.jpg'</span>)<span class="ot">;</span><a href="#cb1-3"></a><span class="va">$watermark_image</span> <span class="op">=</span> <span class="fu">imagecreatefrompng</span>(<span class="st">'c08f5b9a5db27bf40bf1174c27c1db5e.png'</span>)<span class="ot">;</span><a href="#cb1-4"></a><a href="#cb1-5"></a><span class="co">// 获取水印图片的宽度和高度</span><a href="#cb1-6"></a><span class="va">$watermark_width</span> <span class="op">=</span> <span class="fu">imagesx</span>(<span class="va">$watermark_image</span>)<span class="ot">;</span><a href="#cb1-7"></a><span class="va">$watermark_height</span> <span class="op">=</span> <span class="fu">imagesy</span>(<span class="va">$watermark_image</span>)<span class="ot">;</span><a href="#cb1-8"></a><a href="#cb1-9"></a><span class="co">// 创建一张与水印图片大小相同的空白图片,并将其透明区域设为透明色</span><a href="#cb1-10"></a><span class="va">$blank_image</span> <span class="op">=</span> <span class="fu">imagecreatetruecolor</span>(<span class="va">$watermark_width</span><span class="ot">,</span> <span class="va">$watermark_height</span>)<span class="ot">;</span><a href="#cb1-11"></a><span class="fu">imagefill</span>(<span class="va">$blank_image</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="fu">imagecolorallocatealpha</span>(<span class="va">$blank_image</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">127</span>))<span class="ot">;</span><a href="#cb1-12"></a><span class="fu">imagecolortransparent</span>(<span class="va">$blank_image</span><span class="ot">,</span> <span class="fu">imagecolorallocatealpha</span>(<span class="va">$blank_image</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">127</span>))<span class="ot">;</span><a href="#cb1-13"></a><a href="#cb1-14"></a><span class="co">// 复制水印图片到空白图片上,并将其透明区域设为透明色</span><a href="#cb1-15"></a><span class="fu">imagecopy</span>(<span class="va">$blank_image</span><span class="ot">,</span> <span class="va">$watermark_image</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="va">$watermark_width</span><span class="ot">,</span> <span class="va">$watermark_height</span>)<span class="ot">;</span><a href="#cb1-16"></a><span class="fu">imagecolortransparent</span>(<span class="va">$blank_image</span><span class="ot">,</span> <span class="fu">imagecolorallocatealpha</span>(<span class="va">$blank_image</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">127</span>))<span class="ot">;</span><a href="#cb1-17"></a><a href="#cb1-18"></a><span class="co">// 设置水印的透明度(取值范围:0-100)</span><a href="#cb1-19"></a><span class="va">$alpha</span> <span class="op">=</span> <span class="dv">50</span><span class="ot">;</span><a href="#cb1-20"></a><a href="#cb1-21"></a><span class="co">// 将水印复制到原始图片上,并设置透明度</span><a href="#cb1-22"></a><span class="fu">imagecopymerge</span>(<span class="va">$source_image</span><span class="ot">,</span> <span class="va">$blank_image</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="dv">0</span><span class="ot">,</span> <span class="va">$watermark_width</span><span class="ot">,</span> <span class="va">$watermark_height</span><span class="ot">,</span> <span class="va">$alpha</span>)<span class="ot">;</span><a href="#cb1-23"></a><a href="#cb1-24"></a><span class="co">// 输出添加水印后的图片</span><a href="#cb1-25"></a><span class="fu">header</span>(<span class="st">'Content-Type: image/jpeg'</span>)<span class="ot">;</span><a href="#cb1-26"></a><span class="fu">imagejpeg</span>(<span class="va">$source_image</span>)<span class="ot">;</span><a href="#cb1-27"></a><a href="#cb1-28"></a><span class="co">// 释放内存</span><a href="#cb1-29"></a><span class="fu">imagedestroy</span>(<span class="va">$source_image</span>)<span class="ot">;</span><a href="#cb1-30"></a><span class="fu">imagedestroy</span>(<span class="va">$watermark_image</span>)<span class="ot">;</span><a href="#cb1-31"></a><span class="fu">imagedestroy</span>(<span class="va">$blank_image</span>)<span class="ot">;</span></code></pre></div><p>在上面的代码中,我们创建了一张与水印图片大小相同的空白图片,并将其透明区域设为透明色。然后,我们将水印图片复制到空白图片上,并将其透明区域设为透明色。最后,我们使用imagecopymerge()函数将空白图片作为水印复制到原始图片上,并根据需要设置透明度。</p><p>请注意,当处理png文件时,需要使用imagecolorallocatealpha()函数来分配透明颜色。此外,在使用imagecolortransparent()函数时,需要将透明颜色的alpha值设置为127,这是因为PNG格式支持8位透明度,取值范围为0-127。</p>
相关文章