Heippa
Tein osoitteeseen http://metalhabbo.com/tekstigeneraattori tuommoisen skriptin, jonka on tarkoitus vääntää kirjoitettu teksi (kirjaimet a-z) vastaaviksi kuviksi.
Tämä ei toimi, paitsi jos on vain samoja kirjaimia.
Koodi näyttää tältä:
<?php //Otetaan teksti laatikosta "teksti" ja asetetaan muuttujaan $teksti $teksti = $_POST["teksti"]; //Fontit: $font_neon = $_POST["neon"]; if ($font_neon == true) { $teksti = str_replace("a", "<img src=\"neon/a.gif\">", $teksti); $teksti = str_replace("b", "<img src=\"neon/b.gif\">", $teksti); $teksti = str_replace("c", "<img src=\"neon/c.gif\">", $teksti); $teksti = str_replace("d", "<img src=\"neon/d.gif\">", $teksti); $teksti = str_replace("e", "<img src=\"neon/e.gif\">", $teksti); $teksti = str_replace("f", "<img src=\"neon/f.gif\">", $teksti); $teksti = str_replace("g", "<img src=\"neon/g.gif\">", $teksti); $teksti = str_replace("h", "<img src=\"neon/h.gif\">", $teksti); $teksti = str_replace("i", "<img src=\"neon/i.gif\">", $teksti); $teksti = str_replace("j", "<img src=\"neon/j.gif\">", $teksti); $teksti = str_replace("k", "<img src=\"neon/k.gif\">", $teksti); $teksti = str_replace("l", "<img src=\"neon/l.gif\">", $teksti); $teksti = str_replace("m", "<img src=\"neon/m.gif\">", $teksti); $teksti = str_replace("n", "<img src=\"neon/n.gif\">", $teksti); $teksti = str_replace("o", "<img src=\"neon/o.gif\">", $teksti); $teksti = str_replace("p", "<img src=\"neon/p.gif\">", $teksti); $teksti = str_replace("q", "<img src=\"neon/q.gif\">", $teksti); $teksti = str_replace("r", "<img src=\"neon/r.gif\">", $teksti); $teksti = str_replace("s", "<img src=\"neon/s.gif\">", $teksti); $teksti = str_replace("t", "<img src=\"neon/t.gif\">", $teksti); $teksti = str_replace("u", "<img src=\"neon/u.gif\">", $teksti); $teksti = str_replace("v", "<img src=\"neon/v.gif\">", $teksti); $teksti = str_replace("w", "<img src=\"neon/w.gif\">", $teksti); $teksti = str_replace("x", "<img src=\"neon/x.gif\">", $teksti); $teksti = str_replace("y", "<img src=\"neon/y.gif\">", $teksti); $teksti = str_replace("z", "<img src=\"neon/z.gif\">", $teksti); } echo $teksti; ?> <div style="padding-left: 45px;"> <form action="tekstigeneraattori.php" method="post"> <input type="name" name="teksti" size="100"><br> <input type="radio" name="neon"> NEON<br> <input type="submit" value="Luo"> </form></div>
Tuo tulostaa esim. tekstin pätkällä "moi" pelkkiä S kuvia ja muuta sekotusta.
Sanalla "moi" lähdekoodi näyttää tämän tilalla:
<img src="neon/m.gif"><img src="neon/o.gif">]<img src="neon/i.gif">
Näin:
<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="ne<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif">n/n.gif">e<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif"><img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="ne<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif">n/n.gif">/m.gif"><img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif"><i<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="ne<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif">n/n.gif">e<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif"><img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="ne<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif">n/n.gif">/m.gif">g <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="ne<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif">n/n.gif">e<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif"><img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="ne<img <img src="neon/s.gif"><img <img src="neon/s.gif">rc="neon/r.gif">c="neon/o.gif">n/n.gif">/i.gif">
Tämä on ihan siansaksaa kyllä.
Mistä tämmöinen virhe johtuu? :O
No mietitään nyt vaikka sanan "hi" muuttamista
korvataan h
Alkuperäinen:
hi
Muuttuu muotoon:
<img src="neon/h.gif">i
Korvataan i
Edellisen tulos:
<img src="neon/h.gif">i
Muuttuu muotoon:
<<img src="neon/i.gif">mg src="neon/h.g<img src="neon/i.gif">f"><img src="neon/i.gif">
Muutenkin toi koodi on ihan järjetön, ennemmin toi if ($font_neon ...-lohko vaikka tälleen:
if ($font_neon) { $uusi=''; for ($i=0;$i<strlen($teksti);$i++) $uusi .= '<img src="neon/' . $teksti[$i] . '.gif">'; $teksti=$uusi; }
Miten tämä sitten kuuluisi asettee?
EDIT: Jollet editoinut aihettas, niin toi loppu ei näkynyt.
Tämä toimii hyvin :)
EDIT2: Jostain syystä onnistuin poistamaan aloitusviestin :S
Tarkistus kuulu oikeaoppisesti tehdä näin:
Tumettaja, tarkoituksella en kommentoinut mitään muuta kuin tuota if -lohkon sisällä olevaa koodia. Eli kaikki muu roska sen ympärillä täytyy vielä korjata erikseen.
Tästähän tuli mielenkiintoisen näköinen säie ilman aloitusviestiä...
(Mod. palautti kuitenkin aloitusviestin.)
Tumettaja kirjoitti:
Tarkistus kuulu oikeaoppisesti tehdä näin:
Tarkistus kuuluu tehdä ennen sijoitusta
Njoo. Käytä preg_replacea, tai sitten jotain muuta säännöllisten lausekkeiden functiota kuten ereg jne. Saattaa muuten toimia panemalla korvattavat ja korvautuvat arrayna (en oo varma asiasta).
strtr: https://www.php.net/strtr
Kun tässähän on monta kuvaa, niin saisiko PHP:llä kasattua monta kuvaa yhdeksi? Eli jos tuolla tekee tekstin KUVA, niin siinä on 4 kuvaa; K, U, V ja A, kun voisi olla yksi kuva; KUVA.
Voit käyttää vaikka for-silmukkaa kirjainten korvaamiseen yksitellen:
<?php $pituus = strlen($teksti); $tulos = ''; for ($i = 0; $i < $pituus; ++$i) { if ('a' <= $teksti[$i] && $teksti[$i] <= 'z') { $tulos .= sprintf('<img src="%s.gif">', $teksti[$i]); } else { $tulos .= $teksti[$i]; } } ?>
Kuvia voit yhdistellä GD-kirjastolla. Koodivinkeissä on kyllä esimerkkejä piirtämisestä, joten etsipä sieltä.
Metabolix kirjoitti:
Voit käyttää vaikka for-silmukkaa kirjainten korvaamiseen yksitellen:
Ihan kätevä tapaus.
Selasin PHP koodivinkeistä Grafiikka osuuden läpi (Uskoisin GD-kirjaston sinne kuuluvan^^), mutta en löytänyt mitään tuon kaltaista mitä hain,
Rocceri kirjoitti:
Kun tässähän on monta kuvaa, niin saisiko PHP:llä kasattua monta kuvaa yhdeksi? Eli jos tuolla tekee tekstin KUVA, niin siinä on 4 kuvaa; K, U, V ja A, kun voisi olla yksi kuva; KUVA.
Sitten opettelet vihdoin ohjelmoimaan itse. Tosin esimerkiksi tämä vinkki sisältää tarvitsemasi koodin.
Tuossa on vielä toinen esimerkki asiasta:
<?php $teksti = "esimerkki"; $kirjaimet = "abcdefghijklmnopqrstuvwxyz"; $kuva = imagecreate(strlen($teksti)*55, 50); $tausta = imagecolorallocate($kuva, 255, 255, 255); for ($i = 0; $i < strlen($teksti); $i++) { $kirjain = $teksti[$i]; if (strstr($kirjaimet, $kirjain) === false) continue; if ($taulu[$kirjain] == "") { $taulu[$kirjain] = imagecreatefromgif("neon/{$kirjain}.gif"); } imagecopy($kuva, $taulu[$kirjain], $i*55, 1, 0, 0, 50, 48); } header("Content-type: image/png"); imagepng($kuva); ?>
Hyvä Antti! Melkein toimii, mutta ei ihan.
Jos kirjoittaa esim. "moi" ja painaa "Luo", niin tämä menee sivulle showimg.php (niin kuuluukin), jossa sitten on tälläinen koodi:
<?php //Otetaan teksti laatikosta "teksti" ja asetetaan muuttujaan $teksti $teksti = $_POST["teksti"]; //Otetaan valinta "valitse" painikkeista ja asetetaan muuttujaan $valitse $valitse = $_POST["valitse"]; //FONT NEON if ($valitse == "neon") { $tyyli = "neon"; $teksti = strtolower($teksti); $uusi=''; for ($i=0;$i<strlen($teksti);$i++) $uusi .= '<img src="neon/' . $teksti[$i] . '.gif">'; $teksti=$uusi; } //FONT DIAMOND elseif ($valitse == "diamond") { $tyyli = "diamond"; $teksti = strtolower($teksti); $uusi=''; for ($i=0;$i<strlen($teksti);$i++) $uusi .= '<img src="diamond/' . $teksti[$i] . '.gif">'; $teksti=$uusi; } //FONT ALPHA elseif ($valitse == "alpha") { $tyyli = "seka"; $teksti = strtolower($teksti); $uusi=''; for ($i=0;$i<strlen($teksti);$i++) $uusi .= '<img src="seka/' . $teksti[$i] . '.gif">'; $teksti=$uusi; } $kirjaimet = "abcdefghijklmnopqrstuvwxyz"; $kuva = imagecreate(strlen($teksti)*55, 50); $tausta = imagecolorallocate($kuva, 255, 255, 255); for ($i = 0; $i < strlen($teksti); $i++) { $kirjain = $teksti[$i]; if (strstr($kirjaimet, $kirjain) === false) continue; if ($taulu[$kirjain] == "") { $taulu[$kirjain] = imagecreatefromgif("$tyyli/{$kirjain}.gif"); } imagecopy($kuva, $taulu[$kirjain], $i*55, 1, 0, 0, 50, 48); } header("Content-type: image/png"); imagepng($kuva); ?>
Tässäkin on (Vai onko?) sama vika kuin tuossa aloitus viestissäni.
Nyt tämä kyllä tulostuu erillailla. Sanalla "moi" sivulla ei ole lähdekoodia (hyvä asia, eli tämä toimii melkein), mutta kuva on tuolla moi sanalla seuraava:
IMG SRC NEON M GIF IMG SRC NEON O GIF IMG SRC NEON I GIF
eikä se mitä kuuluu.
PS. Kun tuossa on tuo imagecopy($kuva, $taulu[$kirjain], $i*55, 1, 0, 0, 50, 48);
, niin miten nuo korkeudet leveydet tms. voi laittaa automaattisiksi? :O
Looppaa kahdesti. Ensin käyt merkkijonon läpi ja lasket kirjainkuvien mittasuhteet yhteen, sitten vasta luot kohdekuvan ja ladot kirjainkuvat siihen.
Tietenkään sinun ei kuulu korvata tekstiä img-tageilla, jos kerran tarkoituksenasi on tehdä siitä yksittäinen kuva.
m o i <img src="neon/m.gif"><img src="neon/o.gif"><img src="neon/i.gif"> IMG SRC NEON M GIF IMG SRC NEON O GIF IMG SRC NEON I GIF
Jos mä olen nyt yhtään kärryillä ongelmasta, niin alla oleva koodilistaus voisi olla ratkaisu ongelmaasi. Tämä on lähes sama kuin Antin kirjoittaman oppaan listaus.
<?php /* lähetetään tunniste selaimelle */ header("Content-type: image/png"); $teksti = isset($_GET['teksti']) ? $_GET['teksti'] : "Vakioteksti"; /* Lasketaan tekstin pituus */ $pituus = 8 * strlen($teksti); $korkeus = 35; /* luodaan tekstin pituinen kuva */ $kuva=imagecreate($pituus, $korkeus); /* määritetään taustaväri ja kaksi muuta väriä */ $tausta=imagecolorallocate($kuva, 255, 255, 255); $musta=imagecolorallocate($kuva, 0, 0, 0); $sininen=imagecolorallocate($kuva, 0, 0, 255); /* piirretään kehykset ja teksti */ imagerectangle($kuva, 0, 0, $pituus-1, $korkeus-1, $musta); imagestring($kuva, 2, 10, 10, $teksti, $sininen); /* lähetetään kuva PNG-muodossa */ imagepng($kuva); /* poistetaan kuva muistista */ imagedestroy($kuva); ?>
Teuron on parepi, mutta vielläkin on yksi ongelma. Tuo koodi luo kirjaimista yhden kuvan, mutta se ei reagoi kirjainten korvaukseen.
Nyt tämä luo kuvan missä on kirjoitettu teksti, mutta kirjainten kuuluisi olla korvattu vastaavilla kuvilla.
Rocceri kirjoitti:
Teuron on parepi, mutta vielläkin on yksi ongelma. Tuo koodi luo kirjaimista yhden kuvan, mutta se ei reagoi kirjainten korvaukseen.
Nyt tämä luo kuvan missä on kirjoitettu teksti, mutta kirjainten kuuluisi olla korvattu vastaavilla kuvilla.
Rocceri kirjoitti:
Kun tässähän on monta kuvaa, niin saisiko PHP:llä kasattua monta kuvaa yhdeksi? Eli jos tuolla tekee tekstin KUVA, niin siinä on 4 kuvaa; K, U, V ja A, kun voisi olla yksi kuva; KUVA.
Pitääkö mun nyt mennä sisälukukurssille, vai miten tuo yllä oleva lainaus pitäisi tulkita?
Ensiksi kun luetaan tämä teksti "teksti" laatikosta, se asetetaan muuttujaan $teksti. Sen jälkeen katsotaan mikä fontti tyyli on valittu ja sen mukaan sitten valitaan kuvat.
A = a.gif B = b.gif jne.
<?php //Otetaan teksti laatikosta "teksti" ja asetetaan muuttujaan $teksti $teksti = $_POST["teksti"]; //Otetaan valinta "valitse" painikkeista ja asetetaan muuttujaan $valitse $valitse = $_POST["valitse"]; //FONT NEON if ($valitse == "neon") { $tyyli = "neon"; $teksti = strtolower($teksti); $uusi=''; for ($i=0;$i<strlen($teksti);$i++) $uusi .= '<img src="neon/' . $teksti[$i] . '.gif">'; $teksti=$uusi; } //FONT DIAMOND elseif ($valitse == "diamond") { $tyyli = "diamond"; $teksti = strtolower($teksti); $uusi=''; for ($i=0;$i<strlen($teksti);$i++) $uusi .= '<img src="diamond/' . $teksti[$i] . '.gif">'; $teksti=$uusi; } //FONT ALPHA elseif ($valitse == "alpha") { $tyyli = "seka"; $teksti = strtolower($teksti); $uusi=''; for ($i=0;$i<strlen($teksti);$i++) $uusi .= '<img src="seka/' . $teksti[$i] . '.gif">'; $teksti=$uusi; } echo $teksti; ?>
Jos on kirjoitettu "moi" m kuuluisi korvata m.gif kuvalla, o o.gif ja i i.gif.
Sen jälkeen tarvitaan tuota sinun koodiasi.
Nämä 3 kuvaa (M, o ja i) pitäisi kasata yhdeksi kuvaksi MOI.
Mutta, sepä ei enään onnistukkaan. Kuvassa lukeekin vain MOI tavallisella fontilla. Eli, tuo ei tee koodi järjestyksessä (?) Se jättää välistä nuo kuva hommelit
Antin esimerkillä onnistunee, mutta copy-paste petti jälleen.
trilog kirjoitti:
Antin esimerkillä onnistunee, mutta copy-paste petti jälleen.
Joo, sain väännettyä toimimaan, mutta eri värisillä kirjaimilla tausta on vääränvärinen. Tekstigeneraattoriin!
Ja, mitenköhän saisi koot automaattisiksi, ettei tarvitse määrittää...
Jäi kysymykset pois viestistä:
1. Millaisella käskyllä saa mitat automaattisiksi? Tai voiko ne jättää pois?
2. Jos 0 0 0 on musta, niin mikä on valkoinen?
Rocceri kirjoitti:
2. Jos 0 0 0 on musta, niin mikä on valkoinen? F F 0 0 0/F F 0?
Oletan, että puhut RGB-arvoista (musta olisi 0, 0, 0 myös esim. HSL-arvoilla). Kun värit ilmoitetaan punaisen, vihreän ja sinisen kombinaationa, valkoinen on "kaikki täysinä", eli esim. asteikolla 0-255 valkoinen on 255, 255, 255; tai heksadesimaalisena FF, FF, FF.
Kiitos eq, mutta viellä on tuo 1. kysymys jäljellä.
3. 1. tehtävän voi jättää väliin, jos joku tietää, miten voi saada valkoisen taustan venytetylle kuvalle. Eli jos on 45px levelä kuva ja se venytetään niin venytetylle alueelle tulee musta väri. Mustan voisi korvata valkoisella.
Imagecopyresampled tai imagefilledrectangle.
temu92 kirjoitti:
Imagecopyresampled tai imagefilledrectangle.
Kiitos kiitos :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.