首页 > 解决方案 > 我的 php 水印功能不适用于 png 图像

问题描述

我正在使用 PHP 函数将我的徽标添加为我网站上上传的图像的水印。但我不知道为什么我的水印功能不适用于 png 文件。但是,它完美地适用于 jpeg 文件。这是我的 PHP 函数。

function watermark($img) {
   global $wm_file, $wm_right, $wm_bottom;

   // image values pulled from config.inc.php
   $logo = './images/' . $wm_file; // path to the watermark.png
   $sp = $wm_right; // spacing from right side
   $sq = $wm_bottom; // spacing from bottom

   $size = getImageSize($img);
   $sizel = getImageSize($logo);
   $imgA = imageCreateFromJpeg($img);
   imageAlphaBlending($imgA, TRUE);
   if($sizel[0] > $size[0] || $sizel[1] > $size[1]) 
   {
      // logo size > img size
      $sizelo[0] = $sizel[0];
      $sizelo[1] = $sizel[1];
      $sizel[0] = ($sizel[0]/2);
      $sizel[1] = ($sizel[1]/2);
   } 
   else 
   {
      $sizelo[0] = $sizel[0];
      $sizelo[1] = $sizel[1];
   }
   $imgBa = imageCreateFromPng($logo);
   $imgB = imageCreateTrueColor($sizel[0], $sizel[1]);
   imageAlphaBlending($imgB, TRUE);
   imageCopyResampled($imgB, $imgBa, 0, 0, 0, 0, $sizel[0], $sizel[1], $sizelo[0], $sizelo[1]);
   imageColorTransparent($imgB, ImageColorAllocate($imgB, 0, 0, 0));
   $perc = 100; 
   imageCopymerge($imgA, $imgB, ($size[0]-$sizel[0]-$sp), ($size[1]-$sizel[1]-$sq), 0, 0, $sizel[0], $sizel[1], $perc);
   unlink($img);
   if(imageJpeg($imgA, $img, 100)) 
   {
      imageDestroy($imgB);
      imageDestroy($imgA);
      return true;
   }
   chmod($img, 0777);
}

标签: php

解决方案


我看到的问题是您正在使用作为为您传递给函数imageCreateFromJpeg()的资源生成资源的方式。$img

如果您通过该函数传递一个 jpeg,它将起作用。如果你传递一个 png 它不会。

我建议使用imagecreatefromstring()它来创建所有资源,因为它不依赖于文件类型。像这样:

$source = imagecreatefromstring(file_get_contents($filePath));

这样做的另一个好处是,如果函数无法从您提供的文件路径创建资源,则它将返回 false,这意味着该文件不是图像文件。

现在您已经拥有可用于其余代码的资源,imageJpeg()将资源作为 jpeg 保存回文件路径。

希望有帮助。

另一个旁注。如果您打算使用 bmp 图像,GD 库没有用于 bmps 的内置函数。但是在 PHP.net 上,确实有人写了一个createimagefromBMP()效果很好的。另外我认为,在最新版本的 PHP 中,GD 库现在确实有一个createimagefromBMP()功能。

我还看到您正在使用unlink()从目录中删除图像。这不是必需的,原因有两个。imageJpeg()只会覆盖原来的。此外,如果由于某种原因您的脚本失败,它可能会过早地删除图像,并且您将丢失图像而不会写入新图像。

使用时请小心,请chmod()务必确保在完成后将权限设置回原始权限。

chmod($img, 777);  //Give broad permissions.

//Do something.

chmod($img, 600(or whatever they were)); //Reset permission back to where they were before you changed them.

推荐阅读