Autor | Zpráva | ||
---|---|---|---|
Thewest123 Profil |
#1 · Zasláno: 3. 1. 2015, 11:23:48
Zdravím,
Mám obrázek: http://statusgen.vycraftito.eu/status-center2.php?name=test&server=93.91.250.117&port=27246&vzhled=1 A kod: $obrazek =("genstatus.png"); header('Content-Type: image/png'); $image_width = 600; // px $image_height = 150; // px $im = imagecreatefrompng($obrazek); $b_stin = imagecolorallocate($im, 0, 0, 0); // Barva stinu - DEFAULTNE CERNA $b_online = imagecolorallocate($im, 0,255,51); // Barva textu Online - DEFAULTNE ZELENA $b_offline = imagecolorallocate($im, 204,0,0); // Barva textu Offline - DEFAULTNE CERVENA $b_status = imagecolorallocate($im, 101, 162, 254); // Barva cisel Online hraci a Maximalne hracu - DEFAULTNE ZLUTA $b_verze = imagecolorallocate($im, 255, 255, 255); // Barva Verze, Nadpisu serveru - DEFAULTNE BILA $b_nadpis = imagecolorallocate($im, 255, 255, 255); // Barva Naspisu - DEFAULTNE BILA $font_file = 'arialbd.ttf'; // umisteni fontu $font = 'lemonmilk.otf'; $text_box_nadpis = imagettfbbox(22,0,$font_file,$_GET['name']); $text_width_nadpis = $text_box_nadpis[2]-$text_box_nadpis[0]; $x_nadpis = ($image_width/2) - ($text_width_nadpis/2); require 'MinecraftQuery.class.php'; $Query = new MinecraftQuery( ); $Query = new MinecraftQuery(); try { $Query->Connect($server, $port); $Info = $Query->GetInfo(); header('Content-Type: image/png'); $image_width = 600; // px $image_height = 150; // px $im = imagecreatefrompng($obrazek); //imagefttext($im, 11, 0, 252, 134, $b_verze, $font_file, $Info['HostName']); //Vykresleni Obrysu Textu //Online imagefttext($im, 28, 0, 243, 117, $b_stin, $font, 'Online'); imagefttext($im, 28, 0, 243, 113, $b_stin, $font, 'Online'); imagefttext($im, 28, 0, 245, 115, $b_stin, $font, 'Online'); imagefttext($im, 28, 0, 241, 115, $b_stin, $font, 'Online'); //Players imagefttext($im, 25, 0, 130, 132, $b_stin, $font_file, $Info['Players']); imagefttext($im, 25, 0, 130, 128, $b_stin, $font_file, $Info['Players']); imagefttext($im, 25, 0, 132, 130, $b_stin, $font_file, $Info['Players']); imagefttext($im, 25, 0, 128, 130, $b_stin, $font_file, $Info['Players']); //MaxPlayers imagefttext($im, 25, 0, 455, 132, $b_stin, $font_file, $Info['MaxPlayers']); imagefttext($im, 25, 0, 455, 128, $b_stin, $font_file, $Info['MaxPlayers']); imagefttext($im, 25, 0, 453, 130, $b_stin, $font_file, $Info['MaxPlayers']); imagefttext($im, 25, 0, 457, 130, $b_stin, $font_file, $Info['MaxPlayers']); //Verze imagefttext($im, 11, 0, 290, 135, $b_stin, $font_file, $Info['Version']); imagefttext($im, 11, 0, 290, 133, $b_stin, $font_file, $Info['Version']); imagefttext($im, 11, 0, 291, 134, $b_stin, $font_file, $Info['Version']); imagefttext($im, 11, 0, 289, 134, $b_stin, $font_file, $Info['Version']); //Name imagefttext($im, 22, 0, 9+$x_nadpis, 52, $b_stin, $font_file, ''.$_GET['name']); imagefttext($im, 22, 0, 9+$x_nadpis, 48, $b_stin, $font_file, ''.$_GET['name']); imagefttext($im, 22, 0, 9+$x_nadpis+2, 50, $b_stin, $font_file, ''.$_GET['name']); imagefttext($im, 22, 0, 9+$x_nadpis-2, 50, $b_stin, $font_file, ''.$_GET['name']); //Vykresleni Textu imagefttext($im, 28, 0, 243, 115, $b_online, $font, 'Online'); imagefttext($im, 25, 0, 130, 130, $b_status, $font_file, $Info['Players']); imagefttext($im, 25, 0, 455, 130, $b_status, $font_file, $Info['MaxPlayers']); imagefttext($im, 11, 0, 290, 134, $b_verze, $font_file, $Info['Version']); imagefttext($im, 22, 0, 9+$x_nadpis, 50, $b_nadpis, $font_file, ''.$_GET['name']); imagepng($im); $_GET['name'] mám vycentrované do prostředka, což je správně. Jak mám ale vycentrovat do obdélníku Max Hracu a Online Hracu proměnné $Info['MaxPlayers'] a $Info['Players'] ? Předem díky za odpověď. |
||
mimochodec Profil |
#2 · Zasláno: 3. 1. 2015, 16:49:16
Nikdo neradí, tak zkusím já. Na http://php.net/function.imagefttext se píše:
x The coordinates given by x and y will define the basepoint of the first character (roughly the lower-left corner of the character). This is different from the imagestring(), where x and y define the upper-left corner of the first character. For example, "top left" is 0, 0. y The y-ordinate. This sets the position of the fonts baseline, not the very bottom of the character. Jinak řečeno: Ta funkce centrování textu neumí. (Obrázkové funkce používám zřídka a nepamatuju si je, tuhle jsem pravděpodobně nepoužil nikdy. Jen čtu manuál.) |
||
Chro. Profil |
#3 · Zasláno: 3. 1. 2015, 17:21:21
Řeší se to opět funkcí imagettfbbox již pracující v [#1]. Ta na základě parametrů jako vel. fontu, druh fontu, délka textu aj. zjistí, kolik text na obrázku zabere pixelů v osách X a Y, tzn. šířku a výšku textu. Takže pro horizontální vycentrování textu na střed (výpočet odsazení od levého okraje) v obrázku o šířce 500 px platí vzorec:
odsazení = (500 - šířka textu) / 2 |
||
Thewest123 Profil |
#4 · Zasláno: 3. 1. 2015, 17:42:14
Chro, díky za odpověď, ale tvůj nápad mi hodí text doprostřed celýho obrázku.
Já bych ten text potřeboval dát do prostřed "buňky" nebo prostě toho obdélníku / políčka. Když v tom obrázku je jednomístné číslo, vypadá to dobře: http://statusgen.vycraftito.eu/status-center2.php?name=test&server=s1.vycraftito.eu&port=25592&vzhled=1 Když je tam ale vícenásobné číslo, nejsou čísla uprostřed políčka: http://statusgen.vycraftito.eu/status-center2.php?name=test&server=93.91.250.117&port=27246&vzhled=1 |
||
Chro. Profil |
To nebylo konkrétní řešení, ale nástin principu. Pokud máš v obrázku, příklad, oblast 100x50 px vzdálenou od levého okraje obrázku 75 px, logicky platí:
odsazení = 75 + ((100 - šířka textu) / 2) Btw, co je to za hloupou hlášku o blbovi, když dám v URL vzhled=0? Vytahal jsem ji za uši, statusgen.vycraftito.eu/status-center2.php?name=test&server=93.91.250.117&port=27246&vzhled[]=1&vzhled[]=2 (nekontroluješ typ vstupu od uživatele zda je to string) |
||
Thewest123 Profil |
#6 · Zasláno: 3. 1. 2015, 20:14:30 · Upravil/a: Thewest123
Možná jsem zjistil, kde je chyba.
$text_box_online = imagettfbbox(25,0,$font_file,$Info['Players']); $Info['Players'] vyhodí hodnotu v čísle, a imagettfbbox mi potom vždycky dát výslednou hodnotu 0. Když ale místo $Info['Players'] dám do imagettfbbox nějaký text, potom je výsledná hodnota větší než 1. Neví někdo, kde je chyba? Případně, umí imagettfbbox pracovat s číslem místo textu? Díky VYŘEŠENO: Omlouvám se, měl jsem chybu v kodu. Kod, kde jsem používal proměnné $Info['Players'] , $Info['MaxPlayers' ] atd. jsem měl před kodem require 'MinecraftQuery.class.php';
Teď už mi funguje. -- Díky moc, Chro! ;) |
||
Chro. Profil |
#7 · Zasláno: 3. 1. 2015, 23:56:58
Prosím. Ještě poznámka k tomu, zda si funkce poradí s číslem v parametru, ve kterém požaduje řetězec. Ano, vestavěné PHP funkce si před zpracováním hodnoty z parametrů převedou případný datový typ integer (1234) nebo float (1234.56) na datový typ string ("1234" resp. "1234.56"). Totéž můžeš udělat i ty za funkci třeba kvůli transparentnosti kódu. Příklad:
$cislo = 123; $souradnice = imagettfbbox(25, 0, 'arial.ttf', (string) $cislo); |
||
Časová prodleva: 9 let
|
0