Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: imagettftext() a łamanie tekstu
Forum PHP.pl > Forum > PHP
siutek
Witam.
Chciałbym wpisać tekst, którego długości nie znam, i która jest różna, w obrazek o stalym wymiarze: np 180px. Więc logiczne jest, że jeśli cały tekst w jednej linii będzie szerszy niż 180px konieczne będzie jego "złamanie". Zastanawiam się jak to zrobić. Musze napisać funkcję która poda mi pozycję spacji (by nie dzielić całych wyrazów), która podzieli mi owy tekst na dwie częśći (w stosunku najdłuższy możliwy fragment : reszta).

oto co spłodziłem do tej pory:

  1.  
  2. function spacePos($title){
  3. $titleBox = imagettfbbox($size, 0, $fontR, $title);
  4. $titleW = $titleBox[2]-$titleBox[0];
  5.  
  6. if($titleW>=180) spacePos($title);
  7. else {
  8.  
  9. }
  10. }


czyli nie za wiele... z funkcji rekurencyjnych zawsze byłem noga :/ jak ot dalej pociągnąć by w odpowiedzi działania funkcji otrzymać pozycję ostatniej spacji, za pomocą której podziele tekst na dwie części i przy pomicji dwóch wywołań funkcji imagettftext() umieszczę na obrazku.

delikatnie mówiąc: HELP? tongue.gif
greycoffey
Jeżeli czcionka jest monospace, to mozesz obliczyć ile znaków się mieści w wierszu, i jeśli będzie np. po 200, to dzielisz co 200 znaków funkcją strpos i ustawiasz trochę mniejsze $y.
prowseed
Cytat(greycoffey @ 18.02.2011, 14:42:58 ) *
Jeżeli czcionka jest monospace, to mozesz obliczyć ile znaków się mieści w wierszu, i jeśli będzie np. po 200, to dzielisz co 200 znaków funkcją strpos i ustawiasz trochę mniejsze $y.


Nie latwiej po prostu dac

  1. $tekst = 'teskt do uciecia';
  2. $znaki = 30; //po ilu znakach ma ciac
  3. wordwrap($tekst,$znaki);


? smile.gif


//EDIT
@down
Dlatego też zacytowałem wypowiedź greycoffey, która właśnie do monospace się odnosi...
fiszol
@prowseed nie koniecznie, bo tak jak napisał greycoffey będzie klops jeśli czcionka nie jest monospace. wordwrap() jak najbardziej, ale sztywno wklepana wartość nie specjalnie.
erix
Cytat
Musze napisać funkcję która poda mi pozycję spacji (by nie dzielić całych wyrazów), która podzieli mi owy tekst na dwie częśći (w stosunku najdłuższy możliwy fragment : reszta).

Trzeba by było stworzyć tablicę, która zawiera szerokość poszczególnych znaków dla fontu (nie dotyczy to monospace, oczywiście).

Jedziesz pętlą po wyrazach, dopisujesz do stringa sprawdzając przy tym, znak po znaku, jak szeroki jest napis (bazując na wspomnianej wyżej tablicy). Jeśli mniejsze niż limit, robisz to samo sprawdzając, czy następny wyraz (a właściwie jego szerokość) zmieści się w limicie. Jeśli nie - przeskakujesz do następnej linijki, jeśli tak - powtarzasz operację.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.