Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Centrowanie w generowanej grafice
Forum PHP.pl > Forum > PHP
Project
Witam!
Mam pytanie a odpowiedzi nie widze w manualu... - to tak dla formalnosci smile.gif
A wiec do rzeczy:
W jaki sposob wysrodkowac text w generowanej grafice??
Wyobrazcie sobie np jpga o wymiarach 40x40 px i teraz jak wysrodkowac generowane texty (cyfry) na nim. W gre wchodza tylko liczby jedno i dwucyfrowe ale problem polega na tym ze cyfra 1 zajmuje duzo mniejszy obszar niz cyfre 4 czy 6...
Ktos z was ma jakies rozwiazanie tego problemu questionmark.gif?
Z gory dziekuje za (p)odpowiedzi.
Pozdrawiam
spenalzo
Cytat
W jaki sposob wysrodkowac text w generowanej grafice??
Wyobrazcie sobie np jpga o wymiarach 40x40 px i teraz jak wysrodkowac generowane texty (cyfry) na nim. W gre wchodza tylko liczby jedno i dwucyfrowe ale problem polega na tym ze cyfra 1 zajmuje duzo mniejszy obszar niz cyfre 4 czy 6...

A może w taki sposób:
obliczasz ile pikseli zajmuje tekst. Dzielisz szerokość obrazka przez dwa i od tego odejmujesz szerokość tekstu podzieloną przez dwa - wartość jaka wyjdzie wstawiasz do funkcji jako początek tekstu.
[php:1:3bd259d495]<?php
$wys=40;
$szer=40;
$szer_txt=8;
$wys_txt=5;
imagestring($image, 1,floor(($szer/2)-($szer_txt/2)),floor(($wys/2)-($wys_txt/2)),$tekst,$kolor);
?>[/php:1:3bd259d495]
Nie wiem czy to wycentruje tekst, ale można spróbować.
Project
chyba nie za bardzo zrozumiales moj problem!
Jak znalezc srodek obrazka to ja wiem... tongue.gif
problem polega na tym ze liczba '11' i liczba '66' maja rozna liczbe pixeli!
Rozwiazaniem problemu bylo by zmierzenie dlugosci (w px) generowanego napisu! ale jak to zrobic?questionmark.gifquestionmark.gif
Ma ktos jakis pomysl?
spenalzo
A napis jest zwykłą czcionką czy TTF?
spenalzo
Jednak manual się kłania:
Cytat
int imagefontwidth ( int font) - Returns the pixel width of a character in font.

Zwraca szerokość czcionki numer X. Innej możliwości nie ma, chyba że ręcznie policzysz ile pikseli zajmuje każdy znak.
garry
Albo niech zastosuje proporcjonalną czcionkę ;)
runahead
Cytat
Albo niech zastosuje proporcjonalną czcionkę winksmiley.jpg

Podpisuje sie pod tym pomyslem, inna metoda to po prostu zmierzenie i zapisanie w tablicy szerokosci kazdego znaku.
Cudi
Nie zawsze to czego szukasz znajdziesz w samym manualu, najlepsze rozwiązania są w komentarzach do związanego z nim tematu. Kiedy bawiłem sie z funkcjami czcionek znalazłem w komentarzu funkcje która centrowała dowolną czcionke, dzieliła ją na wiersze itd. Musisz tylko troche poszukać, bo ja niestety nie jestem teraz w stanie przypomnieć sobie gdzie to dokładnie było :]
spenalzo
Cytat
Podpisuje sie pod tym pomyslem, inna metoda to po prostu zmierzenie i zapisanie w tablicy szerokosci kazdego znaku.

No a o czym my tu piszemy? :-)
Project
Witam!
Powrocilem do sprawy centrowania generowanej grafiki i czegos nadal nie rozumiem!
oto wypis z manuala:
Cytat
int imagefontwidth ( int font) - Returns the pixel width of a character in font.

ok wszystko pieknie ale jak zbadac np dlugosc ciagu znakow "912" jezeli uzywa sie wlasnej czcionki??

Manula raczej nie obfituje w ciekawe przyklady co gorsza nie jest pokazane ani jedno zastosowanie tej funkcji...
Moze ktos zaprezentowac jakis fragment kodu z praktycznym zastosowaniem tego cuda?questionmark.gif
Z gory wielkie dzieki!

POZDRAWIAM
Project
Przegladalem juz manuala i mam juz skrypt generujacy grafike...
Tylko problem ze ustawiam ja niemal ze na sztywno.. tzn sprawdzam ile znaow ma dany ciag a nie ile ma pixeli!!!
sad.gif
Jak mam sprawdzic ile dany ciag w wybranej przezemnie czcionce ma pixel?questionmark.gif
scanner
Sprawdz ile pixeli ma każdy znak, zapisz to sobie w tablicy, zapisz tablice na dysku - masz zrobiny cache.

I teraz sumujesz po kolei odpowiednie elementy tej tablicy do jakiejs zmiennej.
Później mogę napisać Ci kod, jeśli chcesz?
Project
Chetnie zobacze jakis fragment kodu...
Choc nie ukrywam ze zacczynam juz pisac wlasny!
Nie ukrywam ze z przyjemnoscia porowna nasze kody i na ich podstawie stworze ostateczna forme kodu smile.gif
Z gory wielkie dzieki za poswiecenie winksmiley.jpg
Pozdrawiam
Cudi
A mnie sie udało, za pomocą funkcji ImageTTFbBox, dzięki której uzyskałem szerokość ramki w której znajdzie sie mój tekst, oraz ImageTTFText, za pomocą której wstawiłem tekst do obrazka:
[php:1:7cf4218518]<?php
$w = 250;
$h = 250;

$txt = 'Tekst :]';
$fnt = 'Times.ttf';

$size = 35;
$angle = 0;

$im = ImageCreate ($w, $h);
$bgcolor = ImageColorAllocate ($im, 0x77, 0x77, 0x77);
$font = ImageColorAllocate ($im, 0x00, 0x00, 0x00);

$box = ImageTTFBBox($size, $angle, $fnt, $txt);

$x = ($w - ($box[2] - $box[0])) / 2;
$y = ($h - ($box[1] - $box[7])) / 2;
$y -= $box[7];

$text = ImageTTFText($im, $size, $angle, $x, $y, $font, $fnt, $txt);
Imagepng($im, 'pic.png');
ImageDestroy ($im);

echo '<IMG SRC="pic.png">';
?>[/php:1:7cf4218518]

Update:
A w komentarzach do funkcji ImageTTFBBox() jest jeszcze kilka przykładów, które dopiero teraz zauważyłem smile.gif
spenalzo
Dlatego właśnie pytałem się o rodzaj czcionki...
Jak jest zwykła czcionka php to robisz sobie tak:
[php:1:120205f764]<?php
$string="Bla bla bla!";
$dlugosc=(imagefontwidth("4")*strlen($string));
// lub
$font=imageloadfont("font");
$string="Bla bla bla!";
$dlugosc=(imagefontwidth($font)*strlen($string));
?>[/php:1:120205f764]
a jak TTF to wg przykladu Cudi'ego.
Cudi
Ale niestety, mój przykład nie jest doskonały, bo działa tylko gdy $angle = 0. Przy większych kątach napis będzie coraz bardziej na środku, bo php nie obraca względem miejsca tekstu, tylko względem lewego dolnego rogu. Wie ktoś co zrobić żeby to naprawić/zmienić ?
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.