Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Matrix-koodi generaattori

Sivun loppuun

Malfunc [11.11.2007 19:21:57]

#

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>

Malfunc [11.11.2007 19:23:53]

#

Ja demo löytyy tästä: http://koti.mbnet.fi/malfunc/php/matrix/
Kannattaa painaa vaan suoraan generoi...

tsuriga [12.11.2007 09:22:10]

#

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.

moptim [12.11.2007 14:39:20]

#

Aika jännä :)

Malfunc [12.11.2007 17:07:51]

#

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?

tsuriga [12.11.2007 18:27:21]

#

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 :).

walkout_ [14.12.2007 21:44:45]

#

Hmm... jonkin aikaa se mietii kun se generoi kuvan.

Taitaa viedä vähän muistiakin..

Malfunc [30.10.2008 20:04:24]

#

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

Metabolix [14.12.2011 18:37:12]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta