Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Vesileimalogo jpeg kuviin ver.2

kayttaja-2791 [15.08.2004 21:09:19]

#

Elikästä funktiolla voi tulostaa joko yhden kuvan ihan suoraan tallentamatta skriptistä tai sitten kirjoittaa vesileimattuja kuvia käyttäjän määrittämään kansioon (chmod 775). Tallenna logo.png sopivasti alphablendattuna käyttämääsi kansioon. Logon kokoa ja sijaintia voi muuttaa parametrein, lisäksi skripti osaa tarvittaessa käsitellä automaattisesti kaikki kansiossa olevat kuvat. Optiona on myös cachetarkistus joka siis tarkastaa onko kirjoitettavaa vesileimattua kuvaa jo kansiossa, systeemi ei tosin vertaa näiden kokoja (ei tarvitse muodostaa kuvaa = nopeampi).

Käyttö siis:

watermark("kuva.jpg", "logo.png", logon leveys, logon korkeus, jpeg laatu, kuvan kirjoitus tiedostoon, kaikkien kansion kuvien tulostus tiedostoon);

Esim:

watermark("kuva.jpg", "logo.png", 0, 0, 75, 1, 1);

Jos logon mitat antaa 0 & 0 niin käytetään logon alkuperäistä kokoa. Kaksi viimeistä parametriä 1 = true, 0 = false. Jpeg laatu, 100 on paras ja 0 huonoin. Huomaa että skripti huonontaa kuvanlaatua aina, kuvalle tulee alkuperäisen pakkauksen päälle vielä toiset pakkausvirheet. Eli koita käyttää skriptiä mahdollisiman hyvälaatuisiin kuviin jotta saat tulostettua hyvälaatuisia kuvia pienemmällä koolla.

Demo:
http://koti.mbnet.fi/wahit/watermark/

<?php
function watermark($photoname, $logo, $logowidth, $logoheight, $quality, $writetofile, $writeall) {
    /*Anna tähän logon sijoituspaikka, vasen ylänurkka on 0 JA 0.
    Isompi horizontal-arvo siirtää kuvaa oikealle, ja isompi vertical arvo siirtää alaspäin.*/
    $marginhorizontal = 20;
    $marginvertical = 20;

    /*Cachecheck tarkistaa jos samanniminen kuva löytyy jo eikä tällöin ylikirjoita sitä*/
    $cachecheck = "true";

    /*Anna tähän kansio mihin haluat (mikäli haluat) kirjoittaa kuvat tiedostoihin.
    Kirjoita kansion nimi ilman kenoviivaa perässä. Tämä on viimeinen config arvo.*/
    $destination = "watermarked";

    /*Elikästä mikäli vesileimattava kuva on olemassa tai kaikkien kansion vesileimaus on valittu jatkamme, muuten lopetamme alkuunsa.*/
    if (is_file($photoname) or $writeall == 1) {

      /*Mikäli vesileimataan kaikki niin haetaan kansion .jpeg ja .jpg päätteiset tiedostot käsiteltäväksi. Laitetaan ne $files taulukkoon.*/
      if ($writeall == 1) {
        if ($handle = opendir('.')) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                  $extension = explode(".", $file);
                  $extension = array_reverse($extension);
                  if (strtolower($extension[0]) == "jpg" or strtolower($extension[0]) == "jpeg")
                      $files[] = $file;
                }
            }
            closedir($handle);
        }
      }

      /*Muuten käsiteltävä kuva on ainoastaan annettu $photoname*/
      else
        $files[0] = $photoname;

      /*Haetaan logo.*/
      $logo = imagecreatefrompng($logo);

      /*Ehtolauseilla määritellään logon lopulliset mitat.*/
      if ($logowidth == "0" && $logoheight == "0") {
          $logowidth = imagesx($logo);
          $logoheight = imagesy($logo);
      }

      elseif ($logowidth == "0") {
            $logoratio = imagesx($logo) / imagesy($logo);
            $logowidth = $logoratio * $logoheight;
      }

      elseif ($logoheight == "0") {
            $logoratio = imagesx($logo) / imagesy($logo);
            $logoheight = $logowidth / $logoratio;
      }

      /*Sitten aloitetaan itse käsittely.*/
      foreach ($files as $key => $photoname) {
        $writedestination = $destination."/".$photoname;

        /*Jos cachecheck päällä skipataan jo olemassaolevat kuvat.*/
        if ($cachecheck == "true" && is_file($writedestination) && $writetofile == 1) {
          print "<b>Tiedosto $writedestination on jo olemassa.</b> <a href=$writedestination target=_blank>Vanha kuva</a><br>Tiedosto jätetään käsittelemättä. Jos haluat ylikirjoittaa jo olemassaolevan kuvan ota koodista cachetarkistus pois päältä.<br><br>";
          continue;
        }

        $photo = imagecreatefromjpeg($photoname);
        imagealphablending($photo, true);

        imagecopyresized($photo, $logo, $marginhorizontal, $marginvertical, 0, 0, $logowidth, $logoheight, imagesx($logo), imagesy($logo));

        /*Ja sitten kirjoitetaan tiedosto tarvittaessa.*/
        if ($writetofile == 1 or $writeall == 1) {
            if (imagejpeg($photo, $writedestination, $quality) === false)
                print "<b>Tiedoston kirjoitus epäonnistui.</b><br>Tarkista että hakemisto on olemassa ja tarkasta chmod oikeudet.<br><br>";
            else
                print "<b>Tiedoston kirjoitus onnistui</b>.<br>Tiedosto $photoname on kirjoitettu osoitteeseen $destination laadulla $quality. <a href=$writedestination target=_blank>Kuva</a><br><br>";
        }
        /*Jos ei kirjoitetaan syötetään jpeg headeri ja itse kuva.*/
        else {
            header("Content-type: image/jpeg");
            print imagejpeg($photo, '', $quality);
        }
        imagedestroy($photo);
      }
      imagedestroy($logo);
    }
    else
      print "<b>Hakemaasi tiedostoa ei löydy.</b><br>
      Järjestelmä ei tunnistanut tiedostoa $photoname. Tarkista tiedostonimi tai laita kaikkien tiedostojen käsittely päälle.";
}
?>

makeuu [17.08.2004 22:23:34]

#

Erinomainen ;)

temu92 [04.06.2005 16:00:21]

#

\o/
 |
/ \

Juhis [06.04.2007 00:11:28]

#

Miksi tehdä näin helvetin vaikeasti?
http://www.imagemagick.org/Usage/annotating/

rax [30.06.2008 20:21:16]

#

Juhis, tää on tehty GD Libraryllä, ja toi ImageMagickilla.

Kaikilla ei oo ImageMagickia

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta