Olin surffaillut netissä ja etsinyt kunnollista Matrix-koodi taustakuvaa, sellaisia kunnollisia oli löytynyt aika vähän ja oikean kokoisia ei yhtään. Löydettyäni lexandr:in mahtavan fontin päätin sitten tehdä itse PHP:llä generaattorin, kun se kerran oli mahdollista. Ikävä kyllä fontin kanssa oli ongelmia PHP:n imagettftext()-funktion kanssa, josta syystä jouduin turvautumaan kuviin. En myöskään onnistunut vähentämään kuvasta loppukontrastia, kun MBnet käyttää PHP 4.10:tä ja filtterit ovat vasta PHP 5:ssä.
Koodi tarvitsee toimiakseen myös 53 PNG-kuvaa. Lataa kaikki tarvittavat tiedostot tästä.
EDIT: Muutin "-1+1" jutut "(int)":eiksi.
matrix.php
<?php /**************************** MATRIX-KOODI GENERAATTORI (c) Lauri Salmela Fontti: http://lexandr.deviantart.com/art/matrix-code-font-v15-2040700 ****************************/ // Kerää "vakioita" muuttujiin (Lohkon leveys, lohko (pituus) leveys, riviä lohkoon, himmennyksen pituus, kirkas pituus, merkkiväli, kirkkaimman merkin kirkkaus) $lleveys = preg_match("/[0-9]+/", $_GET['lleveys']) ? (int) $_GET['lleveys'] : 30; $lpleveys = preg_match("/[0-9]+/", $_GET['lpleveys']) ? (int) $_GET['lpleveys'] : 100; $rlohkoon = preg_match("/[0-9]+/", $_GET['rlohkoon']) ? (int) $_GET['rlohkoon'] : 1; $hpituus = preg_match("/[0-9]+/", $_GET['hpituus']) ? (int) $_GET['hpituus'] : 8; $kpituus = preg_match("/[0-9]+/", $_GET['kpituus']) ? (int) $_GET['kpituus'] : 3; $mvali = preg_match("/[0-9]+/", $_GET['mvali']) ? (int) $_GET['mvali'] : 3; $kmkirkkaus = preg_match("/0.[0-9]+/", $_GET['kmkirkkaus']) ? (int) $_GET['kmkirkkaus'] : 0.9; // Kerää koot $w = 800; $h = 600; if (preg_match("/[0-9]+x[0-9]+/", $_GET['koko'])) { list($w2, $h2) = explode("x", $_GET['koko']); $w = (int) $w2; $h = (int) $h2; } // Kerää merkkien määrän $mmin = 20; $mmax = 30; if (preg_match("/[0-9]+-[0-9]+/", $_GET['mmaara'])) { list($m1, $m2) = explode("x", $_GET['mmaara']); $mmin = (int) $m1; $mmax = (int) $m2; } // Kerää rivin koon $rkmin = 4; $rkmax = 11; if (preg_match("/[0-9]+-[0-9]+/", $_GET['rkoko'])) { list($r1, $r2) = explode("-", $_GET['rkoko']); $rkmin = (int) $r1; $rkmax = (int) $r2; } // Ladataan kirjaimet kuvista $chr = array(); for ($i = 0; $i < 54; $i++) { $chr[$i] = imagecreatefrompng(($i<10?'0':'').$i.".png"); } // Luodaan kuva $img = imagecreatetruecolor($w, $h); imagefill($img, 0, 0, 0); // Käydään jokainen lohko läpi for ($loh = 0; $loh < ceil($w / $lleveys); $loh++) { // Käydään jokainen pituuslohko läpi for ($ploh = 0; $ploh < ceil($h / $lpleveys)+1; $ploh++) { // Rivejä ruutuun -silmukka for ($rloh = 0; $rloh < $rlohkoon; $rloh++) { $mmaara = rand($mmin, $mmax); $rkw = rand($rkmin, $rkmax); $rkh = $rkw / 36 * 30; $y = $ploh * $lpleveys + rand(0, $lpleveys) - $rkh; $x = $loh * $lleveys + rand(0, $lleveys) - $rkw; // Merkkisilmukka (luo rivin) for ($mn = 0; $mn < $mmaara; $mn++) { // Väritetään kuva $mmn = rand(0, 53); $kopio = $chr[$mmn]; $shade = $mmaara-$mn < $hpituus ? ($mmaara-$mn)/$hpituus : ($mn < $kpituus ? (($kpituus-$mn)/$kpituus+1)*$kmkirkkaus : 1); $total = imagecolorstotal($chr[$mmn]); // Jokaiselle värille paletissa for ($i = 0; $i < $total; $i++) { $index = imagecolorsforindex($chr[$mmn], $i); $v1 = ($shade > 1 ? ($shade-1) * 255 : 0)*($kalennus+1); $red = $v1 > 255 ? 255 : $v1; $v1 = null; $green = $shade * 255 > 255 ? 255 : $shade * 255; $v3 = ($shade > 1 ? ($shade-1) * 255 : 0)*($kalennus+1); $blue = $v3 > 255 ? 255 : $v3; imagecolorset($kopio, $i, $red, $green, $blue); $v3 = null; } // Kopioidaan väritetty kirjain varsinaiseen kuvaan imagecopyresampled($img, $kopio, $x, $y, 0, 0, $rkw, $rkh, 36, 30); $y -= $rkh + $mvali; } // Merkkisilmukka loppuu } // Rivejä lohkoon -silmukka loppuu } // Pituuslohkosilmukka loppuu } // Leveyslohkosilmukka loppuu // Tulostetaan kuva header("Content-Type: image/png"); imagepng($img); ?>
asetukset.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Matrix-koodi generaattorin asetukset</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15"> <style type="text/css"> BODY { background-color: #000000; color: #00ff00; font: bold 14px monospace; } INPUT { border: 2px inset #ffffff; background-color: #000000; color: #00ff00; font: bold 14px monospace; } INPUT.submit { border-style: outset; } INPUT.submit:hover { border-color: #88ff00; } INPUT.submit:active { border-style: inset; } BODY, TD, H1, H3 { text-align: center; } IMG { border-width: 0px; } #oikea { text-align: right; } </style> </head> <body> <h1>Matrix-koodi generaattorin<br>asetukset</h1> <form action="matrix.php" method="get"> <table align="center"> <tr><td colspan="2"><h3>Ruudukko</h3></td></tr> <tr><td>Ruudun leveys (pikseleinä):</td><td><input type="text" value="30" name="lleveys"></td></tr> <tr><td>Ruudun korkeus (pikseleinä):</td><td><input type="text" value="100" name="lpleveys"></td></tr> <tr><td>Riviä ruutuun:</td><td><input type="text" value="1" name="rlohkoon"></td></tr> <tr><td colspan="2"><br><h3>Rivit</h3></td></tr> <tr><td>Himmennyksen pituus (merkkiä):</td><td><input type="text" value="8" name="hpituus"></td></tr> <tr><td>Hohtavan kärjen pituus (merkkiä):</td><td><input type="text" value="3" name="kpituus"></td></tr> <tr><td>Merkkiväli (pikseliä):</td><td><input type="text" value="3" name="mvali"></td></tr> <tr><td>Kirkkaimman merkin lopullinen kirkkaus (0-1):</td><td><input type="text" value="0.9" name="kmkirkkaus"></td></tr> <tr><td>Merkkien määrä väliltä:</td><td><input type="text" value="20-30" name="mmaara"></td></tr> <tr><td>Rivin leveys (3-35 hyvällä laadulla):</td><td><input type="text" value="4-11" name="rkoko"></td></tr> <tr><td colspan="2"><br><h3>Kuva</h3></td></tr> <tr><td>Koko (pikseleinä):</td><td><input type="text" value="1024x768" name="koko"></td></tr> <tr><td colspan="2"><br><input class="submit" type="submit" value="Generoi!"></td></tr> </table> </form> <p id="oikea"> <a href="http://validator.w3.org/check?uri=referer"> <img src="http://www.w3.org/Icons/valid-html40-blue" alt="Validoi tämä HTML 4.0 Transitional" height="31" width="88"> </a><br> © Lauri Salmela 2007<?php if((int) date('Y') > 2007) { echo date('-Y'); } ?> </p> </body> </html>
Ja demo löytyy tästä: http://koti.mbnet.fi/malfunc/php/matrix/
Kannattaa painaa vaan suoraan generoi...
Kyllähän tästäkin luokan olis saanut - olis päässy vaikka kokeilemaan, että mitä tapahtuu kun ei käykään läpi vaihetta x. Koodissa olisi voinut käyttää välejä tietyissä paikoissa enemmän selkeyden parantamiseksi. Preg_matchit ovat ylilyöntejä ja "Undefined index" -huomautuksia tuloop jos serverillä on noticet päällä. Ja sitten, $x-1+1;
? -1+1 on aina 0. Ilmeisesti yrität sillä muuttaa tyypin intiksi, mihin oikea ratkaisu on käyttää joko (int)$var;
tai settype($var, "int");
. Myös $v1 = null ja $v3 = null ovat mielestäni turhia. Hienon kuvan se kyllä tekee.
Aika jännä :)
tsuriga: Joo. Minulla on itseasiassa PHP-kirja, mutta en ole ikinä jaksanut lukea sitä. Siitä johtuu esimerkiksi tuo etten tiennyt että PHP:ssäkin voi tehdä tyyppimuunnoksia. Käytän MBnetin palvelinta ja jostain syystä aina kun tulee virhe se ei palauta mitään. Olen yrittänyt säätää sitä että se palauttaisi virheen, mutta jostain syystä se ei vain toimi. Tosin edellisillä avaimilla se on jostain syystä taas toiminut. Mutta mikä on tämä vaihe X ja mistä "Undefined index"-huomautukset tulevat?
Vaiheella x tarkoitin mielivaltaista vaihetta, riippuen tietysti mahdollisen luokan toteutuksesta. Undefined index -huomautukset tulevat siitä, kun viitataan olemattomiin osoitteisiin taulukossa. Esim. itse ajoin matrix.php-tiedoston tulkin läpi ihan vain komentaen php matrix.php > matrix.png
, ja tällöin kuvatiedostoon tuli huomautuksien takia virheellistä dataa. Suoraan tulkin läpi puskiessa tuosta pitää toki myös poistaa headerin lähetys. Kannattaa asentaa PHP omalle koneelle / virtuaalipalvelimelle testaussessioita varten. Emminäkää kirjoja, manuaalit ovat kivempia :).
Hmm... jonkin aikaa se mietii kun se generoi kuvan.
Taitaa viedä vähän muistiakin..
Tein URLI.netin kustantaman lyhytosoitteenkin sille, jos siitä joskus on jollekkin hyötyä:
http://matrix.urli.net/
Ja suomeksi: http://matrix.urli.net/?lng=fi
Vinkistä pitäisi korjata nuo tsurigan jo mainitsemat varoitukset, ei tästä muuten mitään tule. Lisäksi olisi hyvä, jos koodi osaisi luoda puuttuvat kuvat vaikka imagestring-funktiolla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.