Autor Zpráva
Thewest123
Profil
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
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
Ř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
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
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
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);
Říká se tomu type casting.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: