Autor Zpráva
Prefin
Profil
Ahojda všichni.
Prosím o radu s malým problémem.
Potřebuji fci, která vloží vodoznak do všech obvyklých typů obrázků a vrátí stejný formát jako vložený (gif -> gif, jpeg -> jpeg...).
V níže uvedené (z webu) funguje vše kromě gifu a fakt mě už nenapadá proč.
function WatermarkByImage( 
    $imagepath, //cesta k zdrojovemu jpeg obrazku
    $watermarkpath, //cesta k obrazku s watermarkem
    $outputpath, //cesta pro vystupni obrazek
    $transparency = 80, //pruhlednost watermarku (0-100)
    $Xoffset = 0, //posunuti watermarku v X souradnici 
    $Yoffset = 0, //posunuti watermarku v Y souradnici
    $Xalign = "middle", //umisteni watermarku v x souradnici
                //lze zadat "middle", "left", "right"
    $Yalign = "bottom" //umisteni watermarku v y souradnici
              //lze zadat "top, "middle", "bottom
)
{
    //otevreme oba zdrojove obrazky
    $filetype = substr($imagepath,strlen($imagepath)-4,4);
    //echo $filetype;
    if($filetype==".gif") $image = imagecreatefromgif($imagepath);
    elseif($filetype==".jpg") $image = imagecreatefromjpeg($imagepath);
    elseif($filetype==".jpeg") $image = imagecreatefromjpeg($imagepath);
    elseif($filetype==".png") $image = imagecreatefrompng($imagepath);
    $imagew = imagecreatefromgif($watermarkpath);

    //zjistime jejich velikost
    list($watermarkWidth, $watermarkHeight) = getimagesize($watermarkpath);

    list($imageWidth, $imageHeight) = getimagesize($imagepath);
      
    $xpos = 0;
    $ypos = 0;
    
    //podle parametru funkce upravime promene
    //xpos a ypos
    if ($Xalign == "middle") {
        $xpos = $imageWidth/2 - $watermarkWidth/2 + $Xoffset;
    }
    
    if ($Xalign == "left") {
        $xpos = 0 + $Xoffset;
    }
    
    if ($Xalign == "right") {
        $xpos = $imageWidth - $watermarkWidth - $Xoffset;
    }
    
    if ($Yalign == "middle") {
        $ypos = $imageHeight/2 - $watermarkHeight/2 + $Yoffset;
    }
    
    if ($Yalign == "top") {
        $ypos = 0 + $Yoffset;
    }
    
    if ($Yalign == "bottom") {
        $ypos = $imageHeight - $watermarkHeight - $Yoffset;
    }
    //echo "**";
    //echo $xpos."/".$ypos."<br />";
    //vlozime watermark do obrazku
    imagecopymerge($image, //zdrojovy obrazek
              $imagew, //obrazek watermarku
              $xpos, //x-souradnice, na kterou bude vlozen
                  //watermark ve zdrojovem obrazku
              $ypos, //y-souradnice, na kterou bude vlozen
                  //watermark ve zdrojovem obrazku
              0,
              0, 
              $watermarkWidth, 
              $watermarkHeight, 
              $transparency); //pruhlednost
    //ulozime obrazek do souboru, parametr 100 nastavuje 
    //uroven komprese na nejmene ztratovou kompresi
     
    if($filetype==".gif") imagegif($image, $outputpath);
    elseif($filetype==".jpg") imagejpeg($image, $outputpath, 100);
    elseif($filetype==".jpeg") imagejpeg($image, $outputpath, 100);
    elseif($filetype==".png") imagepng($image, $outputpath);
}

Díky
Chro.
Profil
Nebude to tím, že GIF nepodporuje částečnou průhlednost? Ve skriptu vidím nastaveno 80 (%). U GIFu může být jedna barva z palety jen 100% průhledná.
visionic
Profil *
Chro.:

Co presne nefunguje? Pruhlednost v gifu ti fungovat bude, pokud ho vkladas do obrazku. Jen pruhlednost toho samotneho obrazku treba s prekryvanim jinych elementovych obrazku ti pruhlednost nebude fungovat. Melo by se ti maximalne stat, ze pruhlednost tveho vkladaneho obrazku do obrazku nebude pruhledny, ale nevidim ten problem.

Posledni veci co me napada, jestli je gif tvoren z vice screenu (pohyblivy gif) a nahratim ten vodoznak hodi na posledni screen a pri nahrati ztraci vsechny screeny, tak to mozna bude ono.

Tady koukam na hotove reseni a u gif jsem si vsimnul vice ukonu nez u jpegu: Mozna te neco napadne na odkazu nize.

blog.petrknap.cz/c66-vkladani-vodoznaku-pomoci-php.html
Prefin
Profil
Díky za reakce.
Řešení od Knapa funguje.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: