Kirjoittaja: Antti Laaksonen (2011).
Tähän mennessä kaikki tekemämme PHP-koodit ovat muodostaneet HTML-sivun. Kuitenkin PHP:llä voi tuottaa mitä tahansa muitakin tiedostoja. Yksi kiinnostava sovelluskohde on tehdä PHP-sivu, joka tuottaa kuvatiedoston. Tällöin voimme liittää sivulle kuvia, jotka päivittyvät automaattisesti PHP:n avulla.
Tässä oppaassa tutustumme PHP:n osana olevaan GD-kirjastoon, jonka avulla kuvien muodostaminen on helppoa.
PHP:n tuottaman tiedoston tyyppi on oletuksena text/html
, joka tarkoittaa HTML-sivua. Voimme kuitenkin muuttaa tyyppiä halutessamme header
-funktiolla. Esimerkiksi seuraava rivi määrittää, että tiedosto on tavallinen tekstitiedosto:
header("Content-Type: text/plain");
Seuraava koodi muodostaa kolmerivisen tekstitiedoston:
<?php header("Content-Type: text/plain"); echo "Tämä rivi on ensimmäinen.\n"; echo "Tässä tulee toinen rivi.\n"; echo "Kolmas rivi on jo viimeinen.\n"; ?>
Erona totuttuun PHP:n tulostamat rivinvaihdot vaikuttavat tekstin muotoiluun, koska kyseessä on tavallinen tekstitiedosto.
Seuraava koodi piirtää sinisen suorakulmion, jonka sisällä on punainen ympyrä:
<?php $kuva = imagecreate(300, 200); $tausta = imagecolorallocate($kuva, 230, 230, 230); $sini = imagecolorallocate($kuva, 0, 0, 255); $puna = imagecolorallocate($kuva, 255, 0, 0); imagerectangle($kuva, 50, 20, 200, 150, $sini); imageellipse($kuva, 100, 80, 30, 30, $puna); header("Content-Type: image/png"); imagepng($kuva); ?>
Koodi tuottaa seuraavan kuvan:
Koodin alussa funktio imagecreate
luo uuden kuvan, jonka koko on 300 x 200 pikseliä. Tämän jälkeen määritellään kolme väriä RGB-muodossa funktiolla imagecolorallocate
. Ensimmäisestä määritellystä väristä tulee kuvan taustaväri. Sitten funktiot imagerectangle
ja imageellipse
piirtävät sinisen suorakulmion ja punaisen ympyrän. Lopuksi funktiot header
ja imagepng
tulostavat kuvan PNG-muodossa.
Täydellinen lista GD-kirjaston funktioista on PHP:n manuaalissa. Tutustumme seuraavaksi joihinkin funktioihin esimerkkien kautta.
Seuraava koodi piirtää 500 pientä naamaa satunnaisiin kohtiin kuvaa:
<?php $naama = imagecreate(20, 20); $tausta = imagecolorallocate($naama, 255, 255, 255); $musta = imagecolorallocate($naama, 0, 0, 0); $kelta = imagecolorallocate($naama, 255, 255, 0); imagecolortransparent($naama, $tausta); // naaman piirtäminen imagefilledellipse($naama, 10, 10, 18, 18, $kelta); imageellipse($naama, 10, 10, 18, 18, $musta); imageellipse($naama, 7, 7, 2, 2, $musta); imageellipse($naama, 13, 7, 2, 2, $musta); imagearc($naama, 10, 11, 9, 9, 25, 155, $musta); $kuva = imagecreate(300, 200); $tausta = imagecolorallocate($kuva, 255, 255, 255); // 500 satunnaista naamaa for ($i = 0; $i < 500; $i++) { $x = rand(0, 280); $y = rand(0, 180); imagecopy($kuva, $naama, $x, $y, 0, 0, 20, 20); } header("Content-Type: image/png"); imagepng($kuva); ?>
Koodi tuottaa seuraavan kuvan:
Koodissa luodaan kaksi eri kuvaa: $naama
sisältää yhden naaman ja $kuva
sisältää lopullisen kuvan. Funktio imagecopy
kopioi naaman satunnaiseen kohtaan kuvaa. Huomaa myös funktio imagecolortransparent
, joka määrittää, että naaman taustaväri on läpinäkyvä.
Seuraava koodi piirtää analogisen kellon, jossa on tunti- ja minuuttiviisarit:
<?php $kuva = imagecreate(200, 200); $tausta = imagecolorallocate($kuva, 255, 255, 255); $musta = imagecolorallocate($kuva, 0, 0, 0); // kellotaulun reunat ja keskipiste imageellipse($kuva, 100, 100, 160, 160, $musta); imageellipse($kuva, 100, 100, 170, 170, $musta); imageellipse($kuva, 100, 100, 10, 10, $musta); $pii = 3.14159; // kellotaulun numerot for ($tunti = 1; $tunti <= 12; $tunti++) { $kulma = ($tunti / 12) * 2 * $pii - $pii / 2; $x = floor(100 + cos($kulma) * 75 - 1); $y = floor(100 + sin($kulma) * 75 - 3); imagestring($kuva, 1, $x, $y, $tunti, $musta); } // minuuttiviisari $minuutti = date("i"); $kulma = ($minuutti / 60) * 2 * $pii - $pii / 2; $loppux = floor(100 + cos($kulma) * 65); $loppuy = floor(100 + sin($kulma) * 65); imageline($kuva, 100, 100, $loppux, $loppuy, $musta); // tuntiviisari $tunti = date("H") + $minuutti / 60; $kulma = ($tunti / 12) * 2 * $pii - $pii / 2; $loppux = floor(100 + cos($kulma) * 35); $loppuy = floor(100 + sin($kulma) * 35); imageline($kuva, 100, 100, $loppux, $loppuy, $musta); header("Content-Type: image/png"); imagepng($kuva); ?>
Koodi tuottaa seuraavan kuvan:
Kellon piirtämiseen vaadittavaa matematiikkaa käsittelee matematiikkaoppaan 2. osa.
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.