Kirjautuminen

Haku

Tehtävät

Oppaat: PHP-ohjelmointi: Osa 15 - Kuvien luonti

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat
  3. Osa 3 - if-rakenne
  4. Osa 4 - for-silmukka
  5. Osa 5 - Taulukot
  6. Osa 6 - Lomakkeet
  7. Osa 7 - Nettisivusto
  8. Osa 8 - Lisää silmukoista
  9. Osa 9 - Tiedostot
  10. Osa 10 - Omat funktiot
  11. Osa 11 - Istunnot
  12. Osa 12 - Tietokannat
  13. Osa 13 - Tietoturva
  14. Osa 14 - Olio-ohjelmointi
  15. Osa 15 - Kuvien luonti
  16. Osa 16 - Säännölliset lausekkeet
  17. Osa 17 - Merkistöt
  18. Osa 18 - PHP:n ongelmat

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.

Tiedoston tyyppi

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";
?>

Kokeile koodia

Erona totuttuun PHP:n tulostamat rivinvaihdot vaikuttavat tekstin muotoiluun, koska kyseessä on tavallinen tekstitiedosto.

Ensimmäinen kuva

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.

Esimerkki: Satunnaiset naamat

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ä.

Esimerkki: Analoginen kello

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.


Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta