2009-11-13 2 views
4

Я использую этот код для создания водяного знака.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 содержит трансапарентную часть, она должна показывать изображение ниже в этой части ....?

+0

Получение типа изображения из расширения файла является наивным подходом: вместо этого используйте getimagesize()! – ntd

ответ

4

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

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); 
} 
3

Формат 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); 

И here's the link на страницу PHP вручную для ImageMagick :: compositeImage (из которых приведенный выше пример).

Смежные вопросы