我的php水印功能不适用于png图像

时间:2018-08-05 23:58:37

标签: php

我正在使用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);
}

1 个答案:

答案 0 :(得分:0)

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

如果通过函数传递jpeg,它将起作用。如果您传递了png,则不会。

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

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

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

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

希望有帮助。

另一注。如果打算使用bmp图像,则GD库没有bmp的内置函数。但是在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.