Воден знак на изображение с php

Моят уебсайт (кодиран изцяло в 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);   
}

Проблемът е, че водният знак има прозрачен фон, но се показва като черен фон на изображението. Виждал съм неща за алфа смесване и т.н., но всъщност не знам какво е това. Искам да разбера какво правя, както и да отстраня проблема, така че водният знак да е прозрачен, както трябва. Истинската картина трябва да запълва пространството.

Благодаря предварително.


person Scott Fink    schedule 24.02.2012    source източник
comment
Jpegs не поддържат прозрачност   -  person Explosion Pills    schedule 24.02.2012


Отговори (3)


Скот, тук може да се случват много неща.

  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, тъй като показва как да промените непрозрачността на изображение. Може да е близо до това, което се опитвате да постигнете, или може да накара друга мисъл.

person AlexC    schedule 24.02.2012
comment
Така че го разбрах, вместо да използвам imagecopymerge, използвах image copy и работи добре. Видях някъде, че може да има грешка с imagecopymerge, която причинява това в php5 - person Scott Fink; 27.02.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);
?>
person Ярослав Рахматуллин    schedule 24.02.2012

Така че го разбрах; вместо да използвам imagecopymerge() използвах imagecopy() и работи добре.

Видях някъде, че може да има грешка с imagecopymerge(), която причинява това в PHP5.

person Scott Fink    schedule 19.07.2012