Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]imagettftext nie z obrazu tylko z tekstu.
Forum PHP.pl > Forum > Przedszkole
casperii
Borykam się z pewną sytuacją, chcę stworzyć JPG tylko z tekstu.

  1. $font = 'arial.ttf';
  2. $font_size = 12;
  3. $text = 'jakis tekst';
  4. $h = 650;
  5. $w = 60;
  6.  
  7. $ob = ImageCreate($h,$w);
  8. $text_color= ImageColorAllocate($ob,104,104,104);
  9. $bg_color = imagecolorallocate($ob, 208, 208, 208);
  10. $bg_color2 = imagecolorallocate($ob, 229, 229, 229);
  11.  
  12. ImageFill($ob,0,0,$bg_color);
  13. imagettftext($ob, $font_size, 0, 10, 17, $text_color, $font, 'test 1:');
  14. header('Content-type: image/png');
  15. ImagePng($ob);
  16. ImageDestroy($ob);


Obrazek zostaje stworzony, teraz chcę dodać drugi tekst do tego obrazka ale z tłem bg_color2.

  1. ImageFill($ob,0,0,$bg_color);
  2. imagettftext($ob, $font_size, 0, 10, 17, $text_color, $font, 'test 1:');
  3. ImageFill($ob,0,0,$bg_color2);
  4. imagettftext($ob, $font_size, 0, 10, 47, $text_color, $font, 'test 2:');


Nie przynosi zamierzonego efektu. Ogólnie chcę osiągnąć coś takiego , że pod każdym tekstem będzie na przemian inny bg_color.
Reasumując będzie z 10 "rowów" na przemian z innym tłem, szerokość i wysokość każdego ta sama.

Teraz kilka pytań :
- wysokość tego "rowu" gdzie tekst będzie za długi powiększy mi o + 30 px. Rozumiem, że muszę sobie wyliczyć ile tekstu mi wejdzie (chyba strlen ?), potem zliczać wpisany tekst i jeśli wyjdzie więcej to tworzyć + 30 px ? tak

- jak i czy jest możliwość by każdy "row" miał border 1 px ?
Daimos
a zaglądałeś w ogóle do manuala?
ImageFill - Performs a flood fill starting at the given coordinate (top left is 0, 0) with the given color in the image.

Czyli co? W momencie, kiedy robisz drugi raz imagefill, przykrywasz tłem to co zrobiłeś na początku. Do tej funkcji, możesz podać współrzędne od których ma się zacząć wypełnianie.
Co do obramowania, pewnie, wszystko można, wejdź do manuala, pełno funkcji do rysowania kresek, figur itp
casperii
@Daimos, tak wiem , że Imagefill ma współrzędne ale to i tak nic nie daje.

  1. ImageFill($ob,0,0,$bg_color);
  2. imagettftext($ob, $font_size, 0, 10, 17, $text_color, $font, 'test 1:');
  3. ImageFill($ob,0,30,$bg_color2);
  4. imagettftext($ob, $font_size, 0, 10, 47, $text_color, $font, 'test 2:');


Myślę, że bez łączenia obrazów chyba nie ma innej możliwości (?) Ale jeżeli się mylę, to proszę mnie wyprowadzić z błędu.
ctom
Cytat(casperii @ 19.07.2015, 16:43:35 ) *
- wysokość tego "rowu" gdzie tekst będzie za długi powiększy mi o + 30 px. Rozumiem, że muszę sobie wyliczyć ile tekstu mi wejdzie (chyba strlen ?), potem zliczać wpisany tekst i jeśli wyjdzie więcej to tworzyć + 30 px ? tak


nie ... jeżeli korzystasz z fontów ttf to porównaj sobie szerokości np. "i" i "e"
casperii
Panowie ktoś umie mi pomóc?
Na chwilę obecną mam tak:

  1. ImageFill($ob,0,0,$bg_color);
  2. imagettftext($ob, $font_size, 0, 10, 17, $text_color, $font, 'test jakiś:');
  3. imagerectangle($ob,0,0,$w-1,$h-1,$text_color);


powyższy kod tworzy mi obraz o wysokości / szerokości ($w / $h). Wszystko jest ok.
Tylko jak dodać kolejny tekst poniżej z bg_color2 i obramowaniem?

Poniższa opcja nie działa:

  1. ImageFill($ob,0,0,$bg_color);
  2. imagettftext($ob, $font_size, 0, 10, 17, $text_color, $font, 'test jakiś:');
  3. imagerectangle($ob,0,0,$w-1,$h-1,$text_color);
  4.  
  5. ImageFill($ob,30,0,$bg_color2);
  6. imagettftext($ob, $font_size, 0, 10, 17, $text_color, $font, 'test jakiś 2:');
  7. imagerectangle($ob,0,0,$w-1,$h-1,$text_color);
casperii
Cytat(trueblue @ 22.07.2015, 20:03:10 ) *



@trueblue ja już wiem jak tworzyć obramowanie dzięki imagerectangle.
Mój problem polega na tym, że nie wiem co jest źle ale nie mogę stworzyć

tekst 1 (kolor bg 1)
tekst 2 (kolor bg 2)

tekst 1 i tekst 2 ustawiam względem współrzędnych, ale tło jest zawsze tego ostatniego..


trueblue
ImageFill to flood fill, czyli wypełnianie rekursywne/zalewowe poczynając od punktu startowego. Punktów o kolorze innym niż startowy nie wypełni (przy braku tolerancji).
Podałem Ci funkcję, która pozwoli utworzyć tło w wybranym obszarze. Nie jest to funkcja do tworzenia prostokątnych ramek.
casperii
Żeby nie zakładać nowego tematu a tyczy się tak jakby dalszego ciągu mojego skryptu, to mam panowie prośbę, co jest tu źle:

  1. $i=0;
  2. while ($result = $query ->fetch_object()){
  3. if($i == 2){
  4. $tlo = $bg_color2;
  5. }else{
  6. $tlo = $bg_color;
  7. }
  8.  
  9. $co = strlen($result->ingredient);
  10. if($co>50){
  11. $skladnik = $result->ingredient;
  12. $Value1 = wordwrap($skladnik, 70, "\n", true);
  13. $extra = 20;
  14. }else{
  15. $skladnik = $result->ingredient;
  16. }
  17. imagefilledrectangle($ob, 0, 150+$dodaj, $w, 180+$dodaj+$extra, $tlo);
  18. imagettftext($ob, $font_size-2, 0, 185, 170+$dodaj, $text_color, $font, $skladnik);
  19. imagerectangle($ob,0,150+$dodaj,$w-1,180+$dodaj+$extra,$text_color);
  20. $dodaj .=30;
  21. }
  22. $dodaj++;
  23. $i++;


Chcę osiągnąć co drugi by na przemian miał raz bg_color, raz bg_color2, dodatkowo z każdym nowym wyciągniętym rekordem wartość współrzędnej Y ma zwiększyć się o 30. Ale coś nie mogę osiągnąć mojego zamierzonego celu. Gdzie robię błąd?
IProSoft
  1. $i%2 == 0


  1. $dodaj +=30;
casperii
Cytat(IProSoft @ 26.07.2015, 22:43:08 ) *
  1. $i%2 == 0


  1. $dodaj +=30;


Dzięki, problem rozwiązany.

Mam jeszcze takie pytanie, czy na to wszystko co stworzyłem tzn. z tekstu obraz, czy na to mogę nałożyć jakiś znak wodny (mam na myśli jakieś zdjecię png)?
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.