PHP водяные знаки

Я использую этот код для создания водяных знаков.

$image = '1.jpg'; $overlay = 'stamp.png'; $opacity = "20"; if (!file_exists($image)) { die("Image does not exist."); } // Set offset from bottom-right corner $w_offset = 0; $h_offset = 100; $extension = strtolower(substr($image, strrpos($image, ".") + 1)); // Load image from file switch ($extension) { case 'jpg': $background = imagecreatefromjpeg($image); break; case 'jpeg': $background = imagecreatefromjpeg($image); break; case 'png': $background = imagecreatefrompng($image); break; case 'gif': $background = imagecreatefromgif($image); break; default: die("Image is of unsupported type."); } // Find base image size $swidth = imagesx($background); $sheight = imagesy($background); // Turn on alpha blending imagealphablending($background, true); // Create overlay image $overlay = imagecreatefrompng($overlay); // Get the size of overlay $owidth = imagesx($overlay); $oheight = imagesy($overlay); // Overlay watermark imagecopymerge($background, $overlay, $swidth - $owidth - $w_offset, $sheight - $oheight - $h_offset, 0, 0, $owidth, $oheight, $opacity); imagejpeg($background,$image); // Destroy the images imagedestroy($background); imagedestroy($overlay); 

png-изображение содержит текст со всей другой областью как прозрачный. но когда я выполняю этот код, он применяет png над jpg, но транспарантность не поддерживается png. он отображается в коробке.

как я могу это понять. т.е. если png содержит трансапарентную часть, она должна показывать изображение ниже в этой части ….?

заменив imagecopymerge на воображение, решила проблему. вот новый код

 function watermark($image){ $overlay = '../../../photos/photosets/stamp.png'; $opacity = "20"; if (!file_exists($image)) { die("Image does not exist."); } // Set offset from bottom-right corner $w_offset = 0; $h_offset = 100; $extension = strtolower(substr($image, strrpos($image, ".") + 1)); // Load image from file switch ($extension) { case 'jpg': $background = imagecreatefromjpeg($image); break; case 'jpeg': $background = imagecreatefromjpeg($image); break; case 'png': $background = imagecreatefrompng($image); break; case 'gif': $background = imagecreatefromgif($image); break; default: die("Image is of unsupported type."); } // Find base image size $swidth = imagesx($background); $sheight = imagesy($background); // Turn on alpha blending imagealphablending($background, true); // Create overlay image //$overlay = imagecreatefrompng($overlay); // Get the size of overlay $owidth = imagesx($overlay); $oheight = imagesy($overlay); $photo = imagecreatefromjpeg($image); $watermark = imagecreatefrompng($overlay); // This is the key. Without ImageAlphaBlending on, the PNG won't render correctly. imagealphablending($photo, true); // Copy the watermark onto the master, $offset px from the bottom right corner. $offset = 10; imagecopy($photo, $watermark, imagesx($photo) - imagesx($watermark) - $offset, imagesy($photo) - imagesy($watermark) - $offset, 0, 0, imagesx($watermark), imagesy($watermark)); // Output to the browser header("Content-Type: image/jpeg"); imagejpeg($photo,$image); // Overlay watermark // Destroy the images imagedestroy($background); imagedestroy($overlay); } 

Формат jpg не поддерживает прозрачность, поэтому концептуально вам придется:

  • возьмите пиксели из большего изображения (jpeg) и поместите их в буфер
  • захватить непрозрачные пиксели с меньшего изображения (водяной знак) и перенести их в этот буфер, используя альфу по пути

Вероятно, вы захотите, чтобы библиотека сделала это. Мне нравится ImageMagick , тем более, что он встроен в php … вот пример того, как использовать его для этой цели с PHP:

 // Let's read the images. $glasses = new Imagick(); if (FALSE === $glasses->readImage($dir . '/glasses.png')) { throw new Exception(); } $face = new Imagick(); if (FALSE === $face->readImage($dir . '/face.jpg')) { throw new Exception(); } // Let's put the glasses on (10 pixels from left, 20 pixels from top of face). $face->compositeImage($glasses, Imagick::COMPOSITE_DEFAULT, 10, 20); 

И вот ссылка на страницу руководства PHP для ImageMagick :: compositeImage (из которой приведен пример выше).

Вы пробовали использовать imagecopyresampled ()? http://php.net/manual/en/function.imagecopyresampled.php