Водяной знак изображения с php - PullRequest
4 голосов
/ 24 февраля 2012

Мой веб-сайт (полностью закодированный в формате html и php) включает функцию, которая позволяет определенным пользователям загружать изображения Размер изображения и водяных знаков с использованием этого кода:

function watermarkpic($filename) {

ini_set('max_input_time', 300);

require 'config.php';  

$watermark = imagecreatefrompng('watermarknew.png');
$watermarkwidth = imagesx($watermark);
$watermarkheight = imagesy($watermark);

if(preg_match('/[.](jpg)$/', $filename)) {  
        $originalimage = imagecreatefromjpeg($path_to_image_directory . $filename);  
    } else if (preg_match('/[.](gif)$/', $filename)) {  
        $originalimage = imagecreatefromgif($path_to_image_directory . $filename);  
    } else if (preg_match('/[.](png)$/', $filename)) {  
        $originalimage = imagecreatefrompng($path_to_image_directory . $filename);  
    }  

$originalwidth = imagesx($originalimage);
$originalheight = imagesy($originalimage);

$maxsize = 800;
$imgratio = $originalwidth / $originalheight;

if($imgratio > 1) {
    $finalwidth = $maxsize;
    $finalheight = $maxsize / $imgratio;
}
else {
    $finalheight = $maxsize;
    $finalwidth = $maxsize * $imgratio;
}   

$finalimage = imagecreatetruecolor($finalwidth,$finalheight);

imagecopyresampled($finalimage, $originalimage, 0,0,0,0,$finalwidth,$finalheight,$originalwidth,$originalheight);

imagecopymerge($finalimage, $watermark, 0, 0, 0, 0, $watermarkwidth, $watermarkheight, 100);

//now move the file where it needs to go
if(!file_exists($path_to_medimage_directory)) {  
        if(!mkdir($path_to_medimage_directory)) {  
                die("There was a problem. Please try again!");  
        }  
     } 

 imagejpeg($finalimage, $path_to_medimage_directory . $filename);   
}

Проблема в том, что водяной знак имеет прозрачный фон, но на изображении он выглядит черным. Я видел материал об альфа-смешивании и т. Д., Но я действительно не знаю, что это такое. Я хочу понять, что я делаю, а также исправить проблему, чтобы водяной знак был прозрачным, как и должно быть. Реальная картина должна заполнить пространство.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Скотт, здесь может происходить много вещей.

  1. Вам необходимо убедиться, что вы сохранили PNG с использованием альфа-прозрачности, которая не индексируется. Индексированная прозрачность в основном гласит: «Этот цвет (возможно черный) будет отображаться как прозрачный по всему изображению». Когда оно читается браузером или графическим редактором, оно может быть прозрачным, но особенно если вы объединяете его с JPG, прозрачность не будет соблюдена. Если вы хотите понять больше, попробуйте http://www.idux.com/2011/02/27/what-are-index-and-alpha-transparency/

  2. Убедитесь, что вы получаете правильные размеры для обоих изображений. См. Прозрачный PNG поверх JPG в PHP , чтобы убедиться, что вы не столкнулись с той же проблемой.

  3. Если вы все еще сталкиваетесь с проблемами, вы можете проверить здесь: http://php.net/manual/en/image.examples.merged-watermark.php, поскольку он показывает, как изменить непрозрачность изображения. Это может быть близко к тому, что вы пытаетесь совершить, или может вызвать другую мысль.

0 голосов
/ 19 июля 2012

Так что я понял это; вместо imagecopymerge() я использовал imagecopy(), и он работал нормально.

Я где-то видел, что может быть ошибка с imagecopymerge(), которая вызывает это в PHP5.

0 голосов
/ 24 февраля 2012

http://php.net/manual/en/function.imagecopymerge.php:

<?php
   $src = imagecreatefromstring(file_get_contents('watermark.png'));
   $dest = imagecreatefromstring(file_get_contents('Unmarked/indian_elephant_chasing_bird.jpg'));

   // Set the brush
   imagesetbrush($dest, $src);
   // Draw a couple of brushes, each overlaying each
   imageline($dest,
       imagesx($src)/2,
       imagesy($src)/2,
       imagesx($src)/2 ,  
       imagesy($src)/2,  
       IMG_COLOR_BRUSHED);

   header('Content-Type: image/png');
   imagepng($dest);
?>
...