Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP]Obramowanie tekstu w GD

Napisany przez: brzanek 8.11.2018, 08:22:03

Witam mam kod w bibliotece GD i chciałbym uzyskać obramowanie tekstu w kolorze czarnym. Czy w tej funkcji jest możliwe?
Tak wygląda kod

  1. <?
  2. include('db.php');
  3. {
  4. $t=http://www.php.net/time();
  5. // Create a destination
  6. $dest = "images_new/".http://www.php.net/date("Y_m_d_H").".jpg";
  7. // Get contents from original spot
  8. $im = imagecreatefromjpeg("images/mapa_new2018a1.jpg");
  9.  
  10. $white = imagecolorallocate($im, 255, 255, 255);
  11. $red = imagecolorallocate($im, 255, 0, 0);
  12.  
  13. // Save to disk in the new spot and name
  14.  
  15. $dzien["Monday"] = "Poniedziałek";
  16. $dzien["Tuesday"] = "Wtorek";
  17. $dzien["Wednesday"] = "Środa";
  18. $dzien["Thursday"] = "Czwartek";
  19. $dzien["Friday"] = "Piątek";
  20. $dzien["Saturday"] = "Sobota";
  21. $dzien["Sunday"] = "Niedziela";
  22.  
  23. $result = $mysqli->query("SELECT * FROM dane WHERE id_miasto =1 ORDER BY id DESC LIMIT 1");
  24. while ( $row = mysqli_fetch_array($result) ) {
  25. $text = 'Temperatura powietrza na wysokości 2m. '.$row['czas'].' '.$row['godzina'].'';
  26. $tempmax = ''.$row['temp'].'şC';
  27. }
  28. $result = $mysqli->query("SELECT * FROM dane WHERE id_miasto =19 ORDER BY id DESC LIMIT 1");
  29. while ( $row = mysqli_fetch_array($result) ) {
  30. $tempmax1 = ''.$row['temp'].'şC';
  31. }
  32. // Replace path by your own font path
  33. $font = 'arial.ttf';
  34. imagettftext($im, 34, 0, 14, 69, $white, $font, $text);
  35. imagettftext($im, 33, 0, 986, 227, $red, $font, $tempmax); //darłowo
  36. imagettftext($im, 33, 0, 193, 891, $red, $font, $tempmax1); //szczecin
  37.  
  38. imagejpeg($im,$dest, 100);
  39. // Destroy image
  40. imagedestroy($im);
  41. }
  42. ?>


Włączone funkcje GD na serwerze
  1. http://www.php.net/array(12) { ["GD Version"]=> string(26) "bundled (2.1.0 compatible)" ["FreeType Support"]=> bool(true) ["FreeType Linkage"]=> string(13) "with freetype" ["GIF Read Support"]=> bool(true) ["GIF Create Support"]=> bool(true) ["JPEG Support"]=> bool(true) ["PNG Support"]=> bool(true) ["WBMP Support"]=> bool(true) ["XPM Support"]=> bool(true) ["XBM Support"]=> bool(true) ["WebP Support"]=> bool(false) ["JIS-mapped Japanese Font Support"]=> bool(false) }

Napisany przez: trueblue 8.11.2018, 08:37:32

Używasz czasem Google?
https://www.google.com/search?q=php%20gd%20text%20shadow

Napisany przez: brzanek 8.11.2018, 09:23:19

Ta funkcja daje cień tekstu a mi chodzi o obramowanie
Dodając do kodu kilka razy tego samego tekstu z innymi współrzędnymi nie wygląda zbyt czytelnie

  1. <?
  2. include('db.php');
  3. {
  4. $t=http://www.php.net/time();
  5. // Create a destination
  6. $dest = "images_new/".http://www.php.net/date("Y_m_d_H").".jpg";
  7. // Get contents from original spot
  8. $im = imagecreatefromjpeg("images/mapa_new2018a1.jpg");
  9.  
  10. $white = imagecolorallocate($im, 255, 255, 255);
  11. $red = imagecolorallocate($im, 255, 0, 0);
  12. $yellow = imagecolorallocate($im, 223, 217, 0);
  13.  
  14. // Save to disk in the new spot and name
  15.  
  16. $dzien["Monday"] = "Poniedziałek";
  17. $dzien["Tuesday"] = "Wtorek";
  18. $dzien["Wednesday"] = "Środa";
  19. $dzien["Thursday"] = "Czwartek";
  20. $dzien["Friday"] = "Piątek";
  21. $dzien["Saturday"] = "Sobota";
  22. $dzien["Sunday"] = "Niedziela";
  23.  
  24. $result = $mysqli->query("SELECT * FROM dane WHERE id_miasto =1 ORDER BY id DESC LIMIT 1");
  25. while ( $row = mysqli_fetch_array($result) ) {
  26. $text = 'Temperatura powietrza na wysokości 2m. '.$row['czas'].' '.$row['godzina'].'';
  27. $tempmax = ''.$row['temp'].'şC';
  28. }
  29. $result = $mysqli->query("SELECT * FROM dane WHERE id_miasto =19 ORDER BY id DESC LIMIT 1");
  30. while ( $row = mysqli_fetch_array($result) ) {
  31. $tempmax1 = ''.$row['temp'].'şC';
  32. }
  33. // Replace path by your own font path
  34. $font = 'arial.ttf';
  35. imagettftext($im, 34, 0, 14, 69, $white, $font, $text);
  36. imagettftext($im, 36, 0, 984, 227, $black, $fontt, $tempmax); //darłowo
  37. imagettftext($im, 36, 0, 988, 227, $black, $fontt, $tempmax); //darłowo
  38. imagettftext($im, 36, 0, 986, 225, $black, $fontt, $tempmax); //darłowo
  39. imagettftext($im, 36, 0, 986, 229, $black, $fontt, $tempmax); //darłowo
  40. imagettftext($im, 36, 0, 986, 227, $yellow, $fontt, $tempmax); //darłowo
  41. imagettftext($im, 33, 0, 193, 891, $red, $font, $tempmax1); //szczecin
  42.  
  43. imagejpeg($im,$dest, 100);
  44. // Destroy image
  45. imagedestroy($im);
  46. }
  47. ?>

Napisany przez: trueblue 8.11.2018, 12:30:45

Pokaż jakie obramowanie tekstu masz na myśli. Będzie prościej niż zgadywać.
Jeśli prostokątny blok, to być może funkcja imagettfbbox.

Napisany przez: brzanek 9.11.2018, 09:21:24

A więc tak mam kod taki

  1. <?
  2. include('db.php');
  3. {
  4. $t=http://www.php.net/time();
  5. // Create a destination
  6. $dest = "images_new/test.jpg";
  7. // Get contents from original spot
  8. $im = imagecreatefromjpeg("images/mapa_new2018a1.jpg");
  9.  
  10. //imagecopy($im, $image, 0, 0, 20, 13, 80, 40);
  11.  
  12. $white = imagecolorallocate($im, 255, 255, 255);
  13. $grey = imagecolorallocate($im, 90, 202, 72);
  14. $black = imagecolorallocate($im, 55, 55, 55);
  15. $blue = imagecolorallocate($im, 79, 166, 245);
  16. $red = imagecolorallocate($im, 255, 0, 0);
  17. $bluemin = imagecolorallocate($im, 0, 90, 224);
  18. $yellow = imagecolorallocate($im, 248, 240, 0);
  19. $pomapancz = imagecolorallocate($im, 231, 168, 0);
  20.  
  21. $result = $mysqli->query("SELECT * FROM dane WHERE id_miasto =1 ORDER BY id DESC LIMIT 1");
  22. while ( $row = mysqli_fetch_array($result) ) {
  23. $text = 'Temperatura powietrza na wysokości 2m. '.$row['czas'].' '.$row['godzina'].'';
  24. $tempmax = ''.$row['temp'].'';
  25. }
  26. $result = $mysqli->query("SELECT * FROM dane WHERE id_miasto =19 ORDER BY id DESC LIMIT 1");
  27. while ( $row = mysqli_fetch_array($result) ) {
  28. $tempmax1 = ''.$row['temp'].'';
  29. }
  30. // Replace path by your own font path
  31. $new_font = 'ariblk.ttf';
  32. $fontt = 'ARLRDBD.TTF';
  33. $font = 'arial.ttf';
  34. imagettftext($im, 36, 0, 987, 228, $black, $new_font, $tempmax); //darłowo
  35. imagettftext($im, 36, 0, 985, 226, $black, $new_font, $tempmax); //darłowo
  36. imagettftext($im, 36, 0, 986, 227, $yellow, $new_font, $tempmax); //darłowo
  37. imagettftext($im, 36, 0, 255, 861, $black, $new_font, $tempmax1); //szczecin
  38. imagettftext($im, 36, 0, 253, 859, $black, $new_font, $tempmax1); //szczecin
  39. imagettftext($im, 36, 0, 254, 860, $yellow, $new_font, $tempmax1); //szczecin
  40.  
  41. imagejpeg($im,$dest, 100);
  42. // Destroy image
  43. imagedestroy($im);
  44. }

Po wywołaniu pojawia mi się taki obrazek

Chciałbym oby obry był szerszy i bardziej widoczny (może jeszcze do tego dodać cień z prawej strony od dołu)

Napisany przez: trueblue 9.11.2018, 09:45:00

Który obrys?

Napisany przez: brzanek 9.11.2018, 10:05:35

żółtych cyfr na mapie 8.8 i 7.1

Napisany przez: trueblue 9.11.2018, 10:12:18

Wiesz co robi funkcja imagettftext i dlaczego powtórzona jest trzykrotnie przy jednej etykiecie temperatury?
Może gdybyś dał ich tam więcej, z różnym przesunięciem, to osiągnąłbyś efekt jaki chcesz. Czy nie?

Napisany przez: brzanek 9.11.2018, 14:58:27

No właśnie z początku tak myślałem hehe.
Ale pewnie jest na to inny sposób tylko jaki. Powiększając czcionkę też źle to wygląda.
To da się te obramowanie tekstu zrobić czy nie?

Napisany przez: Kshyhoo 15.02.2019, 11:10:19

Cytat(brzanek @ 9.11.2018, 14:58:27 ) *
To da się te obramowanie tekstu zrobić czy nie?

Cytat(trueblue @ 8.11.2018, 08:37:32 ) *
Używasz czasem Google?

Popieram i też się pytam...
  1. function imagettfstroketext(&$image, $size, $angle, $x, $y, &$textcolor, &$strokecolor, $fontfile, $text, $px) {
  2. for($c1 = ($x-http://www.php.net/abs($px)); $c1 <= ($x+http://www.php.net/abs($px)); $c1++)
  3. for($c2 = ($y-http://www.php.net/abs($px)); $c2 <= ($y+http://www.php.net/abs($px)); $c2++)
  4. $bg = imagettftext($image, $size, $angle, $c1, $c2, $strokecolor, $fontfile, $text);
  5. return imagettftext($image, $size, $angle, $x, $y, $textcolor, $fontfile, $text);
  6. }
  7.  
  8. $font_color = imagecolorallocate($im, 255, 255, 255);
  9. $stroke_color = imagecolorallocate($im, 0, 0, 0);
  10. imagettfstroketext($im, 60, 10, 300, 130, $font_color, $stroke_color, $fontt, "TU TWÓJ TEKST", 2);

Oczywiście to przykład...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)