簡體   English   中英

我的php水印功能不適用於png圖像

[英]My php Watermark function is not working for png image

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

我看到的問題是,您正在使用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()權限設置回原始權限。

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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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