PHP: GD-Libraryn käyttö (Kuvankäsittely)

PHP: GD-Libraryn käyttö (Kuvankäsittely)

Viesti Irzu 05 Huhti 2006 21:19

Esimerkit toimivat taas, mutta ne ovat rumia :D

Tämä on ensimäinen oppaani. Älkää arvostelko liian rajusti ;)
Tässä tutoriaalissa käsitellään GD-Libraryn peruskäyttö.

1. Yleistä

-1.1 Mikä on GD-Library?
GD-Library on PHP:n kirjasto, jolla voi käsitellä kuvia.
Se on hyvin tehokas työkalu ja se soveltuu moneen käyttöön.
-1.2 Mitä tarvitsen käyttääkseni GD-Librarya?
Tarvitset GD-Library extensionin, joka on tulee valmiina PHP 5:ssa.
GD:n voi ladata: http://www.boutell.com/gd/
MBnetissä on GD asennettu.

2. Perus funktiot

-2.1 Aloitus
Jotta hyötyisit tästä tutoriaalista täydellisesti, kannattaa osata PHP:n perusasiat.
Esimerkiksi muuttujat.

Aloitetaan->

GD:tä aletaan käyttää funktioilla (katso kommentointi):
Koodi: Valitse kaikki

imagecreatefromgd ("TIEDOSTONIMI")
//Tällä funktiolla luodaan kuva GD muotoisesta tiedostosta

imagecreatefrompng ("TIEDOSTONIMI")
//Tällä funktiolla luodaan kuva PNG muotoisesta tiedostosta

imagecreatefromjpeg("TIEDOSTONIMI")
//Tällä funktiolla luodaan kuva JPG muotoisesta tiedostosta
//Jos käytät yllä olevia funktioita, niin se kuva joka ladataan on taustana!
imagecreate ( koko_x, koko_y )
//Tällä funktiolla tehdään tyhjä kuva.


Tämä ei yksin riitä, sillä kuvalle kannattaa määritellä muuttuja, jotta sitä voidaan käsitellä. Esim:
Koodi: Valitse kaikki
$kuva=imagecreate (100,200); // HUOMAA ; Se pitää olla aina rivin lopussa!

Alussa kannattaa myös määritellä käytettävät värit, koska niitä tarvitsee melkein joka funktiossa.
Se tehdään seuraavasti:
Koodi: Valitse kaikki
$tausta=imagecolorallocate(KUVASI NIMI (Muuttuja), PUNAINEN, VIHREÄ, SININEN);
//Värin määrittelyssä käytetään RGB arvoja. Kuvan nimi pitää olla se muuttuja, minkä me määrittelimme.
//ESIM:
$tausta=imagecolorallocate($kuva, 255, 0 ,0); //Väri on nyt punainen.
//Tämä ei vielä piirrä mitään


Kun haluamme tulostaa kuvan dokumenttiin, käytämme seuraavia funktioita:
Koodi: Valitse kaikki
header("Content-type: image/jpeg"); //Tärkeä, että dokumenttia käsitellään kuvana!
//Voi myös olla esim. image/png
//tämän jälkeen käytämme funktiota:
imagejpeg($kuvannimi);
//Tämä voi olla myös imagepng(), imagegif(), imagewbmp() riippuen minkä tyypin ensiksi määritit.
//Jos olet käyttänyt pelkkää image_create funktiota, tällä ei ole väliä.


-2.2 Piirto
GD käsittelemään tiedostoon voi piirtää monella tapaa.
Ellipsin piirto:
Koodi: Valitse kaikki
imageellipse ( Se kuva muuttuja, Keski_X, Keski_Y, Leveys, Korkeus, Väri )
//Kuva muuttuja=$kuva Väri= vaikka $tausta

//Täytetty ellipsi:
imagefilledellipse( ... Samat kuin edellisessä
//elikkä:
imagefilledellipse( Se kuva muuttuja, Keski_X, Keski_Y, Leveys, Korkeus, Väri )


Kuvan täyttö. Esim. Tausta
Koodi: Valitse kaikki
imagefill ( Kuva Muuttuja, Aloitus X, Aloitus Y , väri )
//Esim:
imagefill ( $kuva, 0, 0, $tausta); //Maalaa taustan värillä $tausta


Mitä olemme tähän menneessä oppineet?
Yksinkertaisen hymiön piirto:
Koodi: Valitse kaikki
<?PHP
/*----------------------------
TODELLA YKSINKERTAINEN HYMIÖ
----------------------------*/
$kuva=imagecreate ( 300, 300 ); //Aloitetaan luomalla kuva.
//Määritellään värit:
$tausta=imagecolorallocate($kuva, 0, 0 ,255);//$tausta on sininen.
$naama=imagecolorallocate($kuva, 255, 255 ,0);//$naama on keltainen.
$silma=imagecolorallocate($kuva, 0, 0 ,0);//$silma on musta.
$suu=imagecolorallocate($kuva, 0, 0 ,0);//samoin $suu.
imagefill ( $kuva, 0, 0, $tausta); //Maalaa taustan värillä $tausta
//Piirretään hymiö
imagefilledellipse( $kuva, 150, 150, 300, 300, $naama ); //ensiksi naama Koko kuvan kokoinen.
imagefilledellipse( $kuva, 90, 100, 75, 75, $silma ); // sitten silmät. SILMÄ1
imagefilledellipse( $kuva, 210, 100, 75, 75, $silma ); // SILMÄ2
imagefilledellipse( $kuva, 150, 200, 190, 20, $silma ); // Ja lopuksi suu.
header("Content-type: image/jpeg"); //Tärkeä, että dokumenttia käsitellään kuvana!

imagejpeg($kuva); //Tulostetaan
?>

Tulos: http://roskakori.no-ip.biz/esimerkit/hymio.php

Tehtäviä
1. Kokeile mitä tapahtuu jos otat header("Content-type: image/jpeg"); pois.
2. Yritä muuttaa silmien muotoa, väriä ja kokoa.
3. Yritä muuttaa kuva erimuotoiseksi. Esim. PNG
4. Koita vaihtaa muuttujien nimiä ja saada koodi toimimaan. Esim. $kuva->$pic


Neliön piirto:
Koodi: Valitse kaikki
imagerectangle ( $kuva, x1, y1, x2, y2, $vari );

Polygonin piirto:
Koodi: Valitse kaikki
$kuinkamontapistetta=6; //Kuinka monta pistettä polygoni käyttää.
//Polygonin pisteet kannattaa määritellä näin:
$pisteet = array(40,  50, 20,  240, 60,  60, 240, 20, 50,  40, 10,  10); //Tässä on kaikki pisteet
//Seuraava funktio piirtää polygonin kuvaan.
imagefilledpolygon($kuva, $pisteet, $kuinkamontapistetta, $vari);

Tekstin piirto:
Koodi: Valitse kaikki
//GD:ssä on myös monia tekstin piirtoa käsitteleviä funktioita.
//Esittelen niistä kaksi:
imagestring ( $KuvanNimi,$Fontti(voit laittaa arvoksi 1), X-piste,Y-piste, "TEKSTI", $vari ); //Tämä on kaikista yksinkertaisin tapa piirtää tekstiä.
//Seuraavaksi tekstin piirto TTF fontilla.
imagettftext ( $KuvanNimi, $KuvanKoko, $Kulma (astetta), X-piste,Y-piste, $vari,"Fontin sijainti. Esim. C:/Windows/Fonts/OCRAext.TTF", "Teksti" );

Viivan piirto:
Koodi: Valitse kaikki
imageline ( $Kuva, x1, y1, x2, y2, $vari );


Mitä olemme tähän menneessä oppineet?
Yksinkertaisen pakettiauton piirto yksinkertaisella taustalla (tausta ladataan tiedostosta):
Koodi: Valitse kaikki
<?PHP
/*----------------------------
TODELLA YKSINKERTAINEN AUTO
----------------------------*/
$kuva=imagecreatefromjpeg ("rekka_tausta.jpg"); //Aloitetaan luomalla kuva. Kuva on valmiiksi tehty.
//Määritellään värit:
$auto=imagecolorallocate($kuva, 255, 255 ,0);//$auto on keltainen.
$teksti_v=imagecolorallocate($kuva, 0, 0 ,0);//$teksti_v on musta.
$rengas=imagecolorallocate($kuva, 0, 0 ,0);//samoin $rengas.
imagefilledellipse($kuva,95,238,70,70,$rengas); //RENKAAT AUTON TAAKSE PIILOON. HUOMAA JÄRJESTYS!
imagefilledellipse($kuva,339,238,70,70,$rengas);
imagefilledpolygon($kuva, array(30,110,300,110,372,176,456,176,456,239,39,237), 6, $auto);//PIIRRETÄÄN AUTON MUOTO
//Piirretään teksti auton päälle.
imagettftext($kuva,20,4,77,190,$teksti_v,"C:/WINDOWS/FONTS/OCRAext.ttf","Iiron Kuljetus");
//TULOSTETAAN
header("Content-type: image/jpeg"); //Tärkeä, että dokumenttia käsitellään kuvana!
imagejpeg($kuva); //Tulostetaan
?>

Tulos: http://roskakori.no-ip.biz/esimerkit/rekka.php

Tehtäviä
1. Yritä muuttaa tekstin fonttia, kokoa ja väriä.
2. Koita tehdä autosta hienompi. (Julkaisen ehkä hienoimman tässä topicissa)
3. Koita muuttaa tausta yksiväriseksi.


3. Hyötykäyttö
Kohta 2 oli vain johdantoa GD:n käyttöön. Nyt alkaa työ->
Tämä osio näyttää miten käytetään GD:tä hyvin, ja miten sitä on järkevä käyttää.
-3.1 Asiat mitä kannattaa tehdä
1. Koodissa kannattaa aina käyttää IF lauseita (paitsi debugissa). Perustelu:
Koodi: Valitse kaikki
if(!($kuva=imagecreate(200,200))){ //Jos kuvaa ei voi ladata
echo "Tapahtui virhe. Ota yhteyttä (erikeepperi90@hotmail.com)!"; //Tulostetaan virhe.
exit; //Ei enää jatketa. Tämä näyttää paljon järkevämmältä kuin viisi riviä virheilmoituksia.
}

2. Kannattaa aina kirjoittaa koodi selvästi sisennettynä ja kannattaa nimetä muuttujat järkevästi. Perustelu:
Koodi: Valitse kaikki
//VERTAA TÄTÄ
if( ( $kuva=imagecreate( 200,200 ) ) ){
$laatikko_vari=imagecolorallocate($kuva, 255, 255 ,0);//keltainen.
$tausta_vari=imagecolorallocate($kuva, 0, 0 ,0);//musta.
imagerectangle ( $kuva, 10, 10, 190, 190, $laatikko_vari );
imagefill ( $kuva, 0, 0, $tausta_vari );
header("Content-type: image/jpeg");
if( !( imagejpeg($kuva) ) ){
   header("Content-type: text/html");
   echo "Kuvaa ei voitu tulostaa, koska se voi sisältää virheitä.";
}
}
//TÄHÄN->
if(($piz=imagecreate(200,200))){
     $n167=imagecolorallocate($piz, 255, 255 ,0);//keltainen.
$tvasda=imagecolorallocate($kuva, 0, 0 ,0);//musta.
imagerectangle ( $piz, 10, 10, 190, 190, $ln167 );
    imagefill ( $piz, 0, 0, $tvasda );
header("Content-type: image/jpeg");
if((imagejpeg($piz))){
header("Content-type: text/html");
echo "Kuvaa ei voitu tulostaa, koska se voi sisältää virheitä."; }
}


-3.2 Hyödyllisiä funktioita
1. imagesx( KUVA ) ja imagesy( KUVA ). Palauttaa kuvan leveyden ja korkeuden. Esim:
Koodi: Valitse kaikki
$kuva=imagecreate(222,200);
$leveys=imagesx($kuva); //$leveys=222
//Funktio on hyödyllinen kun kuva avataan tiedostosta.
$kuva=imagecreatefromjpg("kuva.jpg");
imagesx($kuva); //laskee kuva.jpg:n leveyden.
//Voidaan käyttää jos halutaan vaikka skaalata kuvaa.
$kuva=imagecreatefromjpg("kuva.jpg");
$uusi_leveys=imagesx($kuva)/10;
$uusi_korkeus=imagesy($kuva)/10; //Jaetaan kuvien koot kymmenellä.
$uusikuva=imagecreate($uusi_leveys,$uusi_korkeus);
//--> Jatketaan sitten kun päästään funktioon: imagecopyresized()

2. imagedestroy ( $kuva ) Tämä vapauttaa muistia. Kannattaa kutsua aina kuvan jälkeen.
3. imagecolortransparent ( $kuva , $vari (ei pakollinen) ) Asettaa kuvan läpinäkyvän värin.
4. imagecopy funktiot. Eli imagecopyresized($kohde (uusi kuva), $kuva, 0, 0, 0, 0, $uusileveys, $uusikorkeus, $leveys, $korkeus);
Koodi: Valitse kaikki
//-> Jatketaan:
imagecopyresized($kuva, $uusikuva, 0, 0, 0, 0, $uusi_leveys, $uusi_korkeus, imagesx($kuva), imagesy($kuva));
header("Content-type: image/jpeg");
imagejpeg($uusikuva);
imagedestroy($uusikuva);

KOKO KOODI:
Koodi: Valitse kaikki
$kuva=imagecreatefromjpeg("kuva.jpg");
$uusi_leveys=imagesx($kuva)/2;
$uusi_korkeus=imagesy($kuva)/2; //Puolet pienempi kuva
$uusikuva=imagecreate($uusi_leveys,$uusi_korkeus);//Luodaan uusi kuva.
imagecopyresized($uusikuva,$kuva, 0, 0, 0, 0, $uusi_leveys, $uusi_korkeus, imagesx($kuva), imagesy($kuva)); //kopioidaan kuva uuteen kuvaan.
header("Content-type: image/jpeg"); //Tulostukset
imagejpeg($uusikuva);
imagedestroy($uusikuva); //Vapautetaan muistia.


-3.3 Lopputyö.
Teemme kuvan joka piirtää satunnaisesti viivoja. (ei ole vaikea tehdä.)
Tässä se alkaa->
Koodi: Valitse kaikki
<?PHP
$v=0;
$i=0;
$vari="";
if(isset($_GET['number'])){ //Voit itse määrittää määrän.
  $a=$_GET['number'];
}else{ //Muuten se arvotaan
  $a=rand(4,300);
}
  $kuva=imagecreate(400,500); //Tehdään kuva.
  //Määritellään muuttujat
  $random=rand(0,100);
  $x=10;
  $y=imagesy($kuva);
  //Määritellään värit:
  $valkoinen = imagecolorallocate($kuva, 255, 255, 255);
  $musta = imagecolorallocate($kuva, 0, 0, 0);
  $vihrea = imagecolorallocate($kuva, 0, 255, 0);
  $sininen = imagecolorallocate($kuva, 0, 0, 255);
  imagefill($kuva,0,0,$musta);//tausta
   //Piirretään viivat.. Käytetään while lauseketta.
  while($i<$a){
    $vari=imagecolorallocate($kuva, rand(0,255), rand(0,255), rand(0,255)); //Alustetaan väri randomilla.
    $v=rand(0,3); //arvotaan väri
    switch ($i) { //käytetään switch:iä Piirretään viivat
case 0:
$vari=$valkoinen;
   break;
case 1:
$vari=$vihrea;
   break;
case 2:
$vari=$sininen;
   break;
   case 3:
$vari=imagecolorallocate($kuva, rand(0,255), rand(0,255), rand(0,255)); //Random Väri
   break;
}
    imageline ( $kuva, rand(0,imagesx($kuva)), rand(0,imagesy($kuva)), rand(0,imagesx($kuva)), rand(0,imagesy($kuva)), $vari ); //Lisätään viiva
    $i=$i+1;
}
  //Tulostetaan kuva PNG-muodossa:
  header("Content-Type: image/png");
  imagepng($kuva);
?>

Tulos: http://roskakori.no-ip.biz/esimerkit/pylvas.php

3. Luettavaa

Tässä on hyödyllisiä linkkejä:
http://fi.php.net/manual/fi/ref.image.php
http://www.ohjelmointiputka.net/opas.php?tunnus=gdlb (vähän parempi kun mun :D )
Tulen vielä lisäilemään.

4. Esimerkkejä
Tähän tulen lisäilemään esimerkkejä kun on aikaa.



Nonniin. Tässä se sitten oli. GD-opas aloittelijoille. Toivottavasti tämä auttaa teitä GD:n ja-/tai PHP:n opiskelussa.
Viimeksi muokannut Irzu päivämäärä 10 Huhti 2006 15:52, muokattu yhteensä 2 kertaa
Käyttäjän avatar
Irzu
 
Viestit: 286

Viesti Pepper 08 Huhti 2006 20:19

Kaikissa tulee tämmönen:


Fatal error: Call to undefined function imagecreate() in c:\SERVER\HTTP\esimerkit\pylvas.php on line 10

Hyvältä kuulostaa, mutta olisi kiva nähä, että miltä näyttää...
Game over.
Käyttäjän avatar
Pepper
 
Viestit: 501

Viesti Irzu 08 Huhti 2006 22:59

Pepper kirjoitti:Kaikissa tulee tämmönen:


Fatal error: Call to undefined function imagecreate() in c:\SERVER\HTTP\esimerkit\pylvas.php on line 10

Hyvältä kuulostaa, mutta olisi kiva nähä, että miltä näyttää...

Asensin juuri uuden palvelimen.. GD ei väliaikasesti ole päällä.. pahoittelen..
Edit: Toimii taas :D
Käyttäjän avatar
Irzu
 
Viestit: 286

Palaa alueelle Ohjelmointioppaat



Samankaltaisia viestiketjuja