![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
Witam, znalazłem pewien tutorial odnośnie tworzenia grafiki za pomocą GD. Zmodyfikowałem delikatnie kod który tam był opisany i w efekcie posiadam taki kod:
Oczywiście do jego obsługi wystarczy prosty formularz z oknem textowym "tekst". Ale do rzeczy, kod ten tworzy czarny prostokąt i na nim biały napis. Chciał bym móc manipulować tym tekstem i wielkością prostokąta. Dokładniej mówiąc chciał bym móc ustawić marginesy dla tekstu i jego wyśrodkowanie lub wyjustowanie, odpowiednie zawijanie wierszy w przypadku dłuższego tekstu, skalowanie wielkości prostokąta względem ilości tekstu i wielkości czcionki lub na odwrót, wielkości czcionki względem wielkości prostokąta. I czy jest możliwość stosowania zaawansowanych opcji do samej czcionki, takich jak używa się w css. Pozdrawiam, Gray Ten post edytował Gray 23.10.2011, 20:49:29 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
PHP GD nie posiada takich opcji. Jedyne co możesz zrobić to poszukać gotowych rozwiązań lub samemu się pobawić matematycznie, ale to będzie dużo pracy.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 675 Pomógł: 286 Dołączył: 15.06.2009 Skąd: Wieliczka Ostrzeżenie: (0%) ![]() ![]() |
imagettfbbox
to Ci pomoże do zabawy z wielkością prostokąta (marginesy itp.) w przykładzie masz pokazane jak wyśrodkować tekst, na siłę mógłbyś za pomocą tej funkcji robić zawijanie wierszy |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
Dzięki Paweł_W za podpowiedz, w gruncie rzeczy myslałem o tej funkcji ale łudziłem się, że będzie coś co wymaga mniej kombinowania. Jakoś to ogarnę jednak jak wyśrodkować czcionkę względem siebie, tzn. po podzieleniu tekstu na wiersze funkcją wordwrap() aby układały się one pod sobą wyśrodkowane a nie ustawione do lewej? coś w tym stylu:
aaaaaaaaaaaaa aaaaa aaaaaaaaa Czyli <center> lub jakiś sposób na wyjustowanie? Ten post edytował Gray 24.10.2011, 00:15:21 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
W odpowiedzi na to pytanie nie ma nic o czym nie wiesz. Tak jak napisałem powyżej, to zabawa matematyczna - musisz podzielić tekst na słowa i sprawdzać czy kolejne mieszczą się w wierszu. Jeśli nie, to schodzisz niżej. Możesz też w ten sposób próbować wyjustować, tzn. jak już masz gotowy wiersz, to obliczyć odstępy między słowami/literami takie, by zapełnić wiersz.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
Hmm, z tym dzieleniem na słowa i sprawdzaniem czy się mieszczą jest problem. Sprawdzić to potrafię tylko pod względem ilości znaków, w sumie nawet nie tyle potrzeba sprawdzać wyrazy co wiersze. Jednak jak sprawdzić czy ciąg znaków mieści się w danym polu pod względem szerokości w pikselach a nie ilości znaków?
Jak wiadomo każda literka jest innej szerokości, i tak o ile wpasuję sobie idealnie ciąg znaków iiiiiiiiii to inny ciąg np. WWWWWWWWWW kompletnie nie będzie pasował mimo takiej samej ilości znaków. Istnieje jakaś funkcja lub sposób podobny do wordwrap(); która jako wyznacznik miejsca dzielenia ciągu przyjmuje szerokość w pikselach a nie ilość znaków? Jestem początkujący w PHP dlatego proszę o pomoc i ewentualne dokładne wytłumaczenie. Pozdrawiam, Gray. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 47 Pomógł: 1 Dołączył: 14.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
jak dobrze pamiętam to funkcja imageftbbox() ci pomoże
tu zobacz http://www.viawww.wortale.net/135-Centerow...u-w-PHP-GD.html |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
Ta właśnie jestem w trakcie maglowania tej funkcji, zrobiłem takie coś i wydaje się w miarę działać:
Chciał bym prosić kogoś o jakieś wskazówki szczególnie dotyczące pętli while, pisałem ją sam, wydaje się działać ale mogłem coś zawalić. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Twoja metoda nie ma sensu. Porównaj wyniki z użyciem "słów" złożonych z samych liter "i" z takich z samymi "W". Mój sposób jest chyba jedynym sensownym. Badanie szerokości bloku po każdym dodaniu słowa. Kolega Pawel_W podał Ci nazwę funkcji do badania szerokości bloku.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 47 Pomógł: 1 Dołączył: 14.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
http://pl.php.net/manual/en/function.imagettftext.php
a dokładniej chodzi mi o funkcje napisaną przez użytkownika w komentarzu do funkcji imagettftext
a jak to ci nie pomoże to szukaj w google "php gd pietrzenie tekstu" Ten post edytował dwwa 25.10.2011, 20:23:25 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
No właśnie. Dokładnie o coś takiego chodzi. Problem w tym, że ta funkcja testuje jedynie czy słowo mieści się w wierszu, a to tylko wierzchołek góry lodowej - działaj, kolego.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
Wiem, że podał, już wcześniej ktoś inny ją podał i ja ją wykorzystuję w pętli którą podałem wyżej:
Sprawdza ona szerokość podzielonego na wiersze tekstu przy początkowo przyjętej ilości znaków po której następuje "enter" jako 40. Jeśli wykryje, że ta szerokość jest większa niż pożądana to zmniejsza ilość znaków po których następuje "enter" o 1. Będzie zmniejszało długość pojedynczego wiersza aż całość zmieści się w podanej szerokości czyli 490. Staram się napisać teraz podobną pętlę do wysokości, jednak nie będzie redukowała ona długości pojedynczego wiersza, zamiast tego będzie zmniejszała wielkość czcionki. Jednak póki co nie bardzo mi to wychodzi. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
wordwrap jest tutaj bezużyteczny.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
tzn. nie wiem czy jest bezużyteczny w bardzo zoptymalizowanej wersji której ja pewnie nie wymyślę, jednak w mojej pętli wordwrap dzieli ciąg znaków na wiersze jeden pod drugim, w każdym wierszu max 40znaków. I jeśli pętla wykryje ze 40 znaków to za dużo przy ustalonej szerokości to zmniejsza wiersz o 1. Wtedy wordwrap dostaje polecenie podziału ciągu na wiersze jeden pod drugim, 39 znaków na wiersz itd.
Oczywiście można zauważyć, że imageftbbox() sprawdza szerokość już po podziale przez wordwrap. Ten post edytował Gray 25.10.2011, 20:36:41 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Bezużyteczny, bo - jak napisałem powyżej - jeden ciąg długości X znaków może być 2 razy dłuższy/krótszy niż drugi. Optymalizacją się nie martw, ale co się stanie jak wordwrap wygeneruje Ci tak, że zmieściłoby się jeszcze jedno słowo? Nie martw się optymalizacją zanim nie działa jak powinno (IMG:style_emoticons/default/smile.gif) Zrób explode(' ', $string) i dodawaj klocek po klocku. Wchodzi - dodajemy do wiersza. Nie wchodzi? Schodzimy niżej.
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 675 Pomógł: 286 Dołączył: 15.06.2009 Skąd: Wieliczka Ostrzeżenie: (0%) ![]() ![]() |
obiło mi się kiedyś o uszy coś takiego jak phpHyphenator, który dzieli tekst tak, aby ładnie się "justował" - może to Ci pomoże, chociaż nie wiem dokładnie czy cały skrypt jest napisany w php (IMG:style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Temat jest bardzo ciekawy. To może przydać: http://www.google.pl/search?gcx=w&sour...stify+algorithm
EDIT Ja jestem w trakcie pisania nakładki obiektowej dla GD (bardziej dla praktyki niż użyteczności). Zainspirowany tym tematem zacząłem robić metodę wypisywania tekstu jako bloku. Póki co zrobiłem sobie centrowanie tekstu. Efekt jest taki: (IMG:http://img692.imageshack.us/img692/8459/47941390.png) Kod metody:
A powyższy obrazek wywołałem tak:
Metoda oczywiście zawiera błędy. Fajnie byłoby, gdyby udało się stworzyć rozwiązanie, które służyłoby do wypisywania tekstu z dowolnym sposobem wyrównania. Zastanawia mnie jak najlepiej rozwiązać justowanie:
Wydaje mi się, że sposób 3. jest najlepszy, ale jaki współczynnik obrać? (IMG:style_emoticons/default/smile.gif) Ten post edytował croc 26.10.2011, 00:16:36 |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
Heh fajnie, że kogoś to zainspirowało. Ja jestem początkujący w PHP więc raczej w samym pisaniu niewiele pomogę. Jedynie zauważyłem, że w programach tekstowych np. Word justowanie polega na zwiększaniu spacji pomiędzy wyrazami. Najlepiej w całym bloku wszystkie spacje zwiększać o tyle samo i ewentualne nadwyżki/niedobory redukować spacjami na końcu wiersza.
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
i ewentualne nadwyżki/niedobory redukować spacjami na końcu wiersza. Obawiam się, że to już nie będzie justowanie. Justowanie to dokładne rozłożenie od lewej do prawej. Trzeba policzyć długość spacji w każdym wierszu, która przeważnie będzie liczbą zmiennoprzecinkową. Potem trzeba wstawiać spację po spacji, uwzględniając zaokrąglenie dla danej pozycji. Przykład: średnia długość spacji: 1.7px licznik: 1.7 SPACJA 1: 2px licznik: 3.4 3.4 - 2 = 1.4 SPACJA 2: 1px licznik: 5.1 5.1 - 3 = 2.1 SPACJA 3: 2px licznik: 6.8 6.8 - 5 = 1.8 SPACJA 4: 2px itd. |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 127 Pomógł: 0 Dołączył: 5.04.2010 Ostrzeżenie: (10%) ![]() ![]() |
Nie bardzo rozumiem, poco liczyć długość wszystkich spacji w każdym wierszu (może to przez tą późną godzinę)? Nie łatwiej by było sprawdzać długość każdego wiersza w pixelach i te krótsze wiersze "wydłużać", wstawiając równomiernie spacje między wyrazami?
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 25.08.2025 - 01:31 |