[PHP] Tekst na obrazku w dokladnym miejscu

0

Mam o to sobie taki skrypt abc.php:

<?php

header("Content-type: image/png");

$obraz=imagecreatefromjpeg('obrazek.jpg');
$kolor['1'] = ImageColorAllocate($obraz, 255, 255, 255);
$kolor['2'] = ImageColorAllocate($obraz, 0, 0, 0);
$kolor['3'] = ImageColorAllocate($obraz, 255, 0, 0);

$tekst; //<<--DO TEJ ZMIENNEJ BEDE PRZSYLAL TEKST Z FORMULARZA

ImageTTFText($obraz, 30, 0, 102, 80, $kolor['2'], "arial.ttf",
$tekst);

ImagePNG($obraz);

ImageDestroy($obraz);

?>

$obraz=imagecreatefromjpeg('obrazek.jpg'); bedzie wygladac tak:
user image

zas sam formularz bedzie wygladal tak:

<html> 
<head> 
<title>WYSYLANIE</title> 
</head> 
<body> <form action="gotowe.php" method="post"> 
<input type="text" name="text"><br>
<input type="submit" name="Submit" value="Wyślij">
</form>
</body> </html>

Moje pytanie jest takie po wpisaniu tekstu w formularzu i przeslaniu go do zmiennej nastepuje wyswietlenie tekstu na obrazku.
Wszystko bylo by fajnie gdy by nie to ze kazda literaz z wyrazu wpisanego w formularzy powinna sie znajdowac w osobnej ramce (ramka jest narysowana na obrazku) czyli jak wpisze: WITAM to W znajdzie sie w pierwszej ramce nastepnie I w nastepnej itd... musi byc to rowne i ladnie wygladajace.
Nie mam pojecia jak to zrobic
Bradzo prosze was o pomoc

Za pomoc z gory dziekuje i pozdrawaim Paweł

0

rozdziel string na tablice (albo skorzystaj z tego że już nią jest właściwie) i leć po znaku mając współrzędne poszczególnych kratek + matma na poziomie kl. 1 podstawówki i tyle

0
Adamo napisał(a)

rozdziel string na tablice (albo skorzystaj z tego że już nią jest właściwie) i leć po znaku mając współrzędne poszczególnych kratek + matma na poziomie kl. 1 podstawówki i tyle

Dzieki za odpowiedz Adamo
ale sluchaj jestem bardzo poczatkujacy heh a z matmy nidy nie bylem orlem
bys mogl mi pomoc to zrobic
bardzo cie prosze

0

Zamiast:

ImageTTFText($obraz, 30, 0, 102, 80, $kolor['2'], "arial.ttf",
$tekst);

Zrób:

$x = 10;
$y = 20;
$szerKratki = 20;

for ($a = 0; $a < strlen($tekst);$a++)
ImageTTFText($obraz, 30, 0, $x+$a*$szerKratki, $y, $kolor['2'], "arial.ttf",
$tekst[$a]);

Pisane z głowy, mogą być błędy.

0
Gorion napisał(a)

for ($a = 0; $a < strlen($tekst);$a++)
ImageTTFText($obraz, 30, 0, $x+$a*$szerKratki, $y, $kolor['2'], "arial.ttf",
$tekst[$a]);</php>

Pisane z głowy, mogą być błędy.

Kod ten nie zadziala, jesli dlugi tekst ma sie wrap'owac :), czyli przechodzic do kratek w linii nizej. To juz jednak prosto dodac.

0

nadal jest zle
czcionka nachodzi na linie :(
robilem to z czcionka o stalej szerokosci :( ehh

moze ktos inny ma inny pomysl

0

Ustawiłeś $szerKratki = 20; ?
20px to tak sobie strzeliłem, jaka jest szerokość kratki u Ciebie?

0

pytanei 1 musi to byc obrazek szczerze powiem ze ja bym to tak rozwiazal:

function Wyswietl($tekst, $szer_kafl, $wys_kafl, $ilwpoz, $ilwpio) 
{
ob_start();
/* (+2) do szerokosci i wyskosci wynika z szerokosci obramowania */
echo "<div style=\"width:".($szer_kafl*$ilwpoz+2)."px; height:".($wys_kafl*$ilwpio+2)."px; border: 1px solid black; font-size:10pt; \">";
	for ($i = 0, $d=$ilwpoz*$ilwpio; $i < $d; $i++)
	{
		echo "<div style=\"width:".$szer_kafl."px; height:".$wys_kafl."px; border: 1px solid black; text-align: center; float: left\">$tekst[$i]</div>";
	}
echo "</div>";
ob_end_flush();
}
// wyswietla tekst w ramce o szerokosci 20*20px i 20*10px
Wyswietl("wypisz jakis tekst", 20, 20, 20, 10);

wada tego roziwazania jest to ze tekst nie jest zawijany jesli jest za dlugi tylko wpisany litera po literze do nastepujacych kratek , ale to rowniez mozna rozwiazac tylko wtedy algorytm bedzie wygladal troche inaczej.

0
Maker napisał(a)

pytanei 1 musi to byc obrazek szczerze powiem ze ja bym to tak rozwiazal:
function Wyswietl($tekst, $szer_kafl, $wys_kafl, $ilwpoz, $ilwpio)
{
ob_start();
/* (+2) do szerokosci i wyskosci wynika z szerokosci obramowania /
echo "<div style="width:".($szer_kafl
$ilwpoz+2)."px; height:".($wys_kafl*$ilwpio+2)."px; border: 1px solid black; font-size:10pt; ">";
for ($i = 0, $d=$ilwpoz*$ilwpio; $i < $d; $i++)
{
echo "<div style="width:".$szer_kafl."px; height:".$wys_kafl."px; border: 1px solid black; text-align: center; float: left">$tekst[$i]</div>";
}
echo "</div>";
ob_end_flush();
}
// wyswietla tekst w ramce o szerokosci 2020px i 2010px
Wyswietl("wypisz jakis tekst", 20, 20, 20, 10);

> wada tego roziwazania jest to ze tekst nie jest zawijany jesli jest za dlugi tylko wpisany litera po literze do nastepujacych kratek , ale to rowniez mozna rozwiazac tylko wtedy algorytm bedzie wygladal troche inaczej.


napisales sie ehh ale na marne bo ja musze to zrobic na obrazku :( a to co podalem jest tylko przykladem
0
Gorion napisał(a)

Ustawiłeś $szerKratki = 20; ?
20px to tak sobie strzeliłem, jaka jest szerokość kratki u Ciebie?

to takze nie pomoga
piersze kilka znakow jest dobrze wpisywanych w ramke
lecz koljene juz nachodza na ramke :(

0

musisz bo to ma byc na jakism obrazku zaden problem zawsze mozesz zrobic tlo czy musisz bo to gdzies wysylasz tak przerobiony obrazek nie okresliles sie ze swoim problemem na co Ci takie rozwiazanie ;) a specjalnie sie nie napisalem ;]

a tak na marginesie czcionka arial lub innymi ktorych szerokosc nie jest stala a tak jest w ich wypadku ta technika nigdy nie bedzies idealnie trafial w kratki musialbys napisac wlasny algorytm by dla kazdej litery dawal odpowiednie przesuniecie poczytaj sobie troche o czcionkach rozmiarach to ze czcionka jest rozmiaru 8 czy 10 nic nie znaczy jej rzeczywiste wymiary sa troche bardziej zlozone ;] jedyna czcionka ktora tutaj sie sprawdzi to Courier New lub podobna o stalej szerokosci kazdego znaku

BTW: te kratki na tym obrazku za bardzo rowne nie sa ;] no chyba ze rzeczywisty jest idealny bo z tym obrazkiem to musialbys sie naprawde nagimnastykowac ;)

0
Maker napisał(a)

musisz bo to ma byc na jakism obrazku zaden problem zawsze mozesz zrobic tlo czy musisz bo to gdzies wysylasz tak przerobiony obrazek nie okresliles sie ze swoim problemem na co Ci takie rozwiazanie ;) a specjalnie sie nie napisalem ;]

a tak na marginesie czcionka arial lub innymi ktorych szerokosc nie jest stala a tak jest w ich wypadku ta technika nigdy nie bedzies idealnie trafial w kratki musialbys napisac wlasny algorytm by dla kazdej litery dawal odpowiednie przesuniecie poczytaj sobie troche o czcionkach rozmiarach to ze czcionka jest rozmiaru 8 czy 10 nic nie znaczy jej rzeczywiste wymiary sa troche bardziej zlozone ;] jedyna czcionka ktora tutaj sie sprawdzi to Courier New lub podobna o stalej szerokosci kazdego znaku

BTW: te kratki na tym obrazku za bardzo rowne nie sa ;] no chyba ze rzeczywisty jest idealny bo z tym obrazkiem to musialbys sie naprawde nagimnastykowac ;)

wczesniej juz pisalem ze zmienialem na czcionke o stalej szerokosci i nadal lipa
ten obrazek co mam ma rowne kratki i wlasnie mnie dziwi dlaczego zadna z metod nie dziala ehh

0

a jak myslicie mozna by bylo jakos zrobic taka wirtualna-przezroczysta tabelke na obrazku tak by mogl obsadzic litery

0

mozesz sobie takie kratki rysowac za pomoca GD i wstawiac w nich litery mozesz zastosowac moje rozwiazanie i w div'ie glowny po prostu ustawic background-image jako obraz na jakim powinnien pojawic sie tekst

normalnie zeby funckcja ktora ktos tam gdzies wczesniej przedstawil dziala poprawnie powinienes uwzgledniac jeszcze szerokosc kazdego znaku $w = imagettfbbox($rozmiar, 0, "czcionka", $tekst[$i]);

$w[2] zawiera szerokosc danego znaku w pikselach
$rozmiar jest to rozmiar czcionki
jesli chodzi o sam opis funkcji odnosze do manuala PHP

i teraz zakladajac ze np jedna kratka w Twoim obrazku ma szerokosc 20 pikseli powstaje oto nastepujaca formula pozycjonujaca w osi X oczywiscie aktualny znak:

$szerk=20;
$px = $x + ($szerk-$w[2])>>2 + ($i*$szerk); 

$x powinna w tym momencie okreslac lewy bok poczatku pierwszej kratki poniewaz za ustalenie przesuniecia aby litera lezala prawidlowo wewnatrz obszaru kazdej nastepnej kratki w poziomie bedzie odpowiadala powyzsza formula. Takze jak pierwsza kratka zaczyna sie na poczatku obrazka => $x=0; ewentualnie $x=1; zaleznie od tego jakiej grubosci jest obramowanie kartki co tez powinno zostac uwzglednione ale tylko w poczatkowym przesunieciu czyli poczatek pozycji $x

dla $y formula jest analogiczna z tym ze jego przesuniecie lepij ustalic stale tak by tekst nie pojawial sie na roznych pozycjach w osi $y bo wtedy nieciekaiwie to wyglada ;)

Dodatkowo musisz jeszcze uwzglednic kolejny czynnik czyli zaden ze znakow czcionki nie moze byc szerszy badz bliski rozmiaru jednej kartki ale to juz chyba oczywiste ;)

Mam nadzieje ze to jest teraz jasne jak to dziala

P.S. jest pozna godzina wiec moga byc pewne niedociagniecia ale jestem tylko czlowiekiem ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1