Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Jak pobrać kolor z dynamicznie generowanego rysunku
Forum PHP.pl > Forum > Przedszkole
jack314
Witam, mam problem z pobieraniem kolorów z dynamicznie generowanego rysunku. W pliku rys.php tworzę rysunek formatu png w taki sposób:
  1.  
  2. function create_rys() {
  3. $im = imagecreatetruecolor (200, 200);
  4. $col_red = ImageColorAllocate($im,255,0,0);
  5. Imagettftext($im,12,45,50,50,$col_red,"arial","Abcde");
  6.  
  7. if(!$im) {
  8. $im = imagecreatetruecolor (150, 30);
  9. $bgc = imagecolorallocate ($im, 255, 255, 255);
  10. $tc = imagecolorallocate ($im, 0, 0, 0);
  11. imagefilledrectangle ($im, 0, 0, 150, 30, $bgc);
  12. imagestring ($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
  13. }
  14. return $im;
  15. }
  16.  
  17. $img = create_rys();
  18. header('Content-Type: image/png');
  19. imagepng($img);
  20. imagedestroy($img);

Rysunek bezpośrednio http://localhost/rys.php wyświetla mi się w przeglądarce. Tak samo z innej strony storna.php
  1. <img src="rys.php" />

Jednak przy próbie pobraniu koloru w skrypcie na strona.php otrzymuję błąd: "Warning: imagecreatefrompng(): 'rys.php' is not a valid PNG file".
A zmienna $file_info zwraca "text/x-php" zamiast PNG, ale nie wiem dlaczego.

  1. $file1 = 'rys.php';
  2. $file_info = new finfo(FILEINFO_MIME);
  3. print $file_info->file($file1, FILEINFO_MIME_TYPE);
  4.  
  5. //$im = ImageCreateFromPng( 'http://localhost/rys.php' );
  6. //$im = ImageCreateFromPng( 'http://nazwa_domeny.pl/rys.php' );
  7. $im = ImageCreateFromPng( 'rys.php' );
  8. $rgb = imagecolorat($im, 1, 1);
  9. $r = ($rgb >> 16) & 0xFF;
  10. $g = ($rgb >> 8) & 0xFF;
  11. $b = $rgb & 0xFF;
  12. var_dump($r, $g, $b);


Dziękuję za wszelkie sugestie.
tzm
A od kiedy plik PHP jest obrazkiem z ktorego mozna zczytac kolory?
Patrze w dokumentacje i moim oczom ukazuje sie to:

  1. $im = imagecreatefrompng("php.png");


A w Twoim kodzie jest tak:

  1. $im = ImageCreateFromPng( 'rys.php' );


Co wyraznie wskazuje blad:

Cytat
Warning: imagecreatefrompng(): 'rys.php' is not a valid PNG file



Czyli temat pod tytulem znajdz roznice miedzy PHP a PNG
Pyton_000
Przecież ten PHP generuje PNG, co za różnica czy to plik PNG, dupa, czy coś innego. Content musi być dobry.

A jak wywołasz z pełnego URL w funkcji create... to też wywala błąd?
jack314
Wg. mojej wiedzy w pliku rys.php jest nagłówek PNG -> header('Content-Type: image/png'); i dzięki temu plik PHP jest traktowany jak plik graficzny PNG.

Cytat(tzm @ 1.09.2014, 18:41:15 ) *
A od kiedy plik PHP jest obrazkiem z ktorego mozna zczytac kolory?
Patrze w dokumentacje i moim oczom ukazuje sie to:

  1. $im = imagecreatefrompng("php.png");


A w Twoim kodzie jest tak:

  1. $im = ImageCreateFromPng( 'rys.php' );


Co wyraznie wskazuje blad:




Czyli temat pod tytulem znajdz roznice miedzy PHP a PNG



cyt. "Rysunek bezpośrednio http://localhost/rys.php wyświetla mi się w przeglądarce."

Cytat(Pyton_000 @ 1.09.2014, 18:55:38 ) *
Przecież ten PHP generuje PNG, co za różnica czy to plik PNG, dupa, czy coś innego. Content musi być dobry.

A jak wywołasz z pełnego URL w funkcji create... to też wywala błąd?

trueblue
Gdybyś wywołał bezpośrednio rys.php bez wystawiania header, widziałbyś, że jest błąd.
Tak jak pisał Pyton_000, content musi być dobry, u Ciebie nie jest.

imagettftext(): Invalid font filename in
jack314
U mnie bez nagłówka nie wyświetla się żaden błąd tylko zawartość tekstowa (binarna) pliku graficznego. Błąd o którym piszesz najprawdopodobniej spowodowany jest tym, że u Ciebie na serwerze brak jest fontu 'arial.ttf'

Cyt. "Rysunek bezpośrednio http://localhost/rys.php wyświetla mi się w przeglądarce."

Cytat(trueblue @ 1.09.2014, 19:12:54 ) *
Gdybyś wywołał bezpośrednio rys.php bez wystawiania header, widziałbyś, że jest błąd.
Tak jak pisał Pyton_000, content musi być dobry, u Ciebie nie jest.

imagettftext(): Invalid font filename in
trueblue
Racja.

Spróbuj wywołać po pełnym URL, tak jak masz w 5 lub 6 linii.
allow_url_fopen musi być włączone: http://php.net/manual/en/filesystem.config...allow-url-fopen
jack314
1. Rysunek w znaczniku <img src="http://nazwa_domeny.pl/rys.php" /> - wyświetla się poprawnie.
2. $file_info - zwraca błąd: Warning: finfo::file(): Failed identify data 0:(null)
3. ImageCreateFromPng( 'rys.php' ); - zwraca ten sam błąd: "Warning: imagecreatefrompng(): 'http://nazwa_domeny.pl/rys.php' is not a valid PNG file"
Zaremowałem po to instrukcje w kodzie, by sugerowało, że to już sprawdzałem.

Cytat(trueblue @ 1.09.2014, 19:47:09 ) *
Racja.

Spróbuj wywołać po pełnym URL, tak jak masz w 5 lub 6 linii.
allow_url_fopen musi być włączone: http://php.net/manual/en/filesystem.config...allow-url-fopen

trueblue
Domyślam się, że po to zakomentowałeś.
1 i 2 punkt nie mają tu znaczenia.
Masz włączone allow_url_fopen na serwerze?
jack314
Tak, jest "On".

Cytat(trueblue @ 1.09.2014, 20:15:21 ) *
Domyślam się, że po to zakomentowałeś.
1 i 2 punkt nie mają tu znaczenia.
Masz włączone allow_url_fopen na serwerze?



Wgrałem na serwer fizyczny plik "rys2.png" z rysunkiem (a nie dynamiczny) i skrypty poprawnie odczytują z niego:
- nagłówek "image/png",
- kolory: int(149), int(135), int(100).
Ale z dynamicznie utworzonego pliku rys.php nie chcą.
trueblue
Sprawdź jaki header zwraca:

  1. $file='http://localhost/rys.php';
  2. $headers = get_headers($file);
  3. print_r($headers);
jack314
get_headers($file) coś mi zwraca "Forbidden", muszę sprawdzić dlaczego.
[0]=> string(22) "HTTP/1.1 403 Forbidden"
[1]=> string(13) "Server: nginx"
[2]=> string(35) "Date: Tue, 02 Sep 2014 10:09:23 GMT"
[3]=> string(43) "Content-Type: text/html; charset=iso-8859-1"
[4]=> string(19) "Content-Length: 402"
[5]=> string(22) "Connection: keep-alive"

Cytat(trueblue @ 2.09.2014, 08:41:12 ) *
Sprawdź jaki header zwraca:

  1. $file='http://localhost/rys.php';
  2. $headers = get_headers($file);
  3. print_r($headers);
Pyton_000
Musisz odpalać z pełnego adresu czyli http://inaczej parser odwołuje się do pliku a nie wyniku
jack314
Działa! Naprowadził mnie ten "Forbidden", wyłączyłem regułki w pliku .htaccess i jest OK. Dziękuję wszystkim: ) Napiszcie, czy powinienem wcisnąć jakiś przycisk na stronie, przy waszych nickach, by zwiększył się Wam licznik "Pomógł:"?
[0] => HTTP/1.1 200 OK
[Server] => nginx
[Date] => Tue, 02 Sep 2014 10:23:53 GMT
[Content-Type] => image/png
[Transfer-Encoding] => chunked
[Connection] => keep-alive
[X-Powered-By] => PHP/5.4.23

Cytat(Pyton_000 @ 2.09.2014, 12:18:15 ) *
Musisz odpalać z pełnego adresu czyli http://inaczej parser odwołuje się do pliku a nie wyniku
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.