NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: PHP GD imagettftext() nepodporuje všechny barvy?

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
papi_CZ
Člen
Avatar
papi_CZ:4.1.2016 20:02

Zdravím,
pracuji na generátoru grafů, kde bude najednou hodně křivek, tudíž potřebuji pro každou křivku jinou barvu(to funguje). Problém však nastává, když chci vygenerovat legendu. Nevygeneruje se celá (jak je vidět v příloze). Pokud však změním barvu textu na černou, tak je vše v pořádku. Už jsem nad tím strávil celkem dost času a vůbec mě nenapadá čím to může být. Zkoušel jsem použít jak calibri.ttf, tak i tahoma.ttf a nic nefunguje. Zajímavé však je, že když použiji imagestring(), tak je vše v pohodě a vykreslí se celá legenda...

Zde jsem si pro kontrolu nechal vygenerovat seznam jednotlivých textů s barvami v RGB:

255, 0, 0 - ALL
242, 121, 80 - php
255, 153, 51 - css
252, 198, 35 - gitignore
209, 209, 61 - COPYING
183, 232, 37 - README
166, 237, 95 - html
63, 232, 7 - txt
97, 250, 97 - zip
30, 232, 81 - js
8, 255, 131 - map
51, 245, 196 - md
56, 224, 224 - LICENSE
7, 170, 224 - swf
13, 111, 209 - eot
37, 82, 217 - ttf
80, 80, 242 - woff
132, 96, 240 - LICENSE-MIT
132, 24, 240 - json
161, 33, 204 - sh
214, 19, 214 - template
245, 42, 194 - log
230, 16, 123 - phtml
250, 67, 113 - htaccess
255, 66, 66 - cfg
217, 93, 52 - htpasswd
250, 126, 2 - version
222, 188, 87 - discover
255, 255, 77 - cfgparse
162, 209, 21 - prestart
150, 219, 81 - airos
96, 219, 55 - edgeos
83, 224, 83 - jetstream
2, 247, 64 - v1910
89, 235, 162 - sql
12, 247, 189 - Doxyfile
20, 224, 224 - md5
35, 185, 235 - HELP_MY_TESTS_DONT_WORK_ANYMORE
8, 130, 252 - VERSION
48, 90, 217 - latin1_sample
130, 26, 235 - awk
210, 77, 255 - exclude
255, 46, 255 - less

Zde je zdroják:

$x = ($width - $margin_right) + 20;
$y = $margin_top + 10;
$angle = 0;
foreach ($exKeys as $value) //exKeys je pole stringů, které chci vypsat
{
        $RGB = getRGB($data[0][$value][0], $data[0][$value][1], $data[0][$value][2]);
        $color = imagecolorallocate($img, $RGB[0], $RGB[1], $RGB[2]);
        imagefilledrectangle($img, $x, $y, $x + 8, $y + 8, $color);
        imagettftext($img, $fontSize, $angle, $x + 15, $y + 10, $color, $fontFile, $value);
        $bbox = imagettfbbox($fontSize, $angle, $fontFile, $value);
        $y += 20;
}
Editováno 4.1.2016 20:04
 
Odpovědět
4.1.2016 20:02
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na papi_CZ
Jenkings:4.1.2016 21:03

Jak tak na to koukám, tak to vypadá že se spíš ten cyklus zastavil řádkem s názvem cfg.
Otázka tedy je, jestli to je skutečně barvou.. pokud bys prohodil pořadí "cfg" a "htpasswd" , vypíše to co ?

Editováno 4.1.2016 21:03
Nahoru Odpovědět
4.1.2016 21:03
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
papi_CZ
Člen
Avatar
papi_CZ:5.1.2016 5:10

Předchozí obrázky jsou z debianu. Na windowsu se to vypsalo až do htpasswd.
Co je ještě zajímavější je, že pokud zvýšim hodnotu proměnné $hLinesCount(výše je 20), která určuje počet řádků v grafu, tak se vypíše kratší legenda. Pro zkoušku jsem zkusil dát hodnotu $hLinesCount na 1000 a legenda se vypsala jenom do swf.
Navíc toto je jediný kus kódu, kde se $hLinesCount objevuje a není tudíž možné ovlivňovat jiné části kódu:

$overlap = 10;
$color = imagecolorallocate($img, 0, 0, 0);
imagesetthickness($img, 1);
$hLinesCount = 1000;
$heightGraph = $height - $margin_bottom;
for($i = 0; $i <= $hLinesCount; $i++)
{
        $text = ($maxYValue / $hLinesCount) * $i;
        $y = $heightGraph - $i * ($heightGraph - $margin_top) / $hLinesCount;
        $x = $margin_left - $overlap;
        imageline($img, $x, $y, $width - $margin_right, $y, $gridColor);

        $bbox = imagettfbbox($fontSize, $angle, $fontFile, $text);
        $x = $margin_left - abs($bbox[0] - $bbox[2]) - $overlap - $yTitleGridCorrection;
        $y += 5;
        imagettftext($img, $fontSize, $angle, $x, $y, $color, $fontFile, $text);
}
 
Nahoru Odpovědět
5.1.2016 5:10
Avatar
papi_CZ
Člen
Avatar
Odpovídá na papi_CZ
papi_CZ:5.1.2016 5:18

*aby ovlivňoval jiné části kódu

 
Nahoru Odpovědět
5.1.2016 5:18
Avatar
papi_CZ
Člen
Avatar
papi_CZ:5.1.2016 13:22

Zkusil jsem ten kód trochu poupravit a čím více textu má statickou barvu, tím více se ho vypíše. Zkusil jsem trochu upravit kód pro takový malý test(viz. příloha). Skoro to vypadá, jako by existoval omezený počet vypsání ttf/obrázek

$x = ($width - $margin_right) + 20;
$y = $margin_top + 10;
$angle = 0;
foreach ($exKeys as $value)
{
        $RGB = getRGB($data[0][$value][0], $data[0][$value][1], $data[0][$value][2]);
        //$RGB = getRGB(210, 90, 90);
        //echo($RGB[0].", ".$RGB[1].", ".$RGB[2]." - ".$value."<br>");
        $color = imagecolorallocate($img, $RGB[0], $RGB[1], $RGB[2]);
        if(strlen($value) > 5)
                $color = imagecolorallocate($img, 0, 0, 0);
        imagefilledrectangle($img, $x, $y, $x + 8, $y + 8, $color);
        imagettftext($img, $fontSize, $angle, $x + 15, $y + 10, $color, $fontFile, $value);
        //imagestring($img, 5, $x + 15, $y - 4, $value, $color);
        $bbox = imagettfbbox($fontSize, $angle, $fontFile, $value);
        $y += 20;
}

Ještě jsem zkusil vykreslit jenom odrážky bez textu a vykreslili se v pohodě...

Editováno 5.1.2016 13:25
 
Nahoru Odpovědět
5.1.2016 13:22
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na papi_CZ
Jenkings:6.1.2016 15:44

A není možné, že ti nějakou funkcí přeteče nějaká složka barvy přes 255 ?

Nahoru Odpovědět
6.1.2016 15:44
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
papi_CZ
Člen
Avatar
Odpovídá na Jenkings
papi_CZ:6.1.2016 16:24

V úvodním příspěvku je seznam barev, které se rovnou posílají do imagecolorallo­cate(), tudíž by to možné být nemělo

 
Nahoru Odpovědět
6.1.2016 16:24
Avatar
Jenkings
Tvůrce
Avatar
Odpovídá na papi_CZ
Jenkings:6.1.2016 20:45

No, teď si tak říkám, jestli jsi zkoušel zakomentovat image header a zjistit co hází php za chyby případně ?

Nahoru Odpovědět
6.1.2016 20:45
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
papi_CZ
Člen
Avatar
Odpovídá na Jenkings
papi_CZ:6.1.2016 20:53

To dělám v jednom kuse, když potřebuju něco debugnout, takže nehází...

 
Nahoru Odpovědět
6.1.2016 20:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.