Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]imagettftext nie z obrazu tylko z tekstu., jak poprawnie wykonać tworzenie JPG z tekstu.
casperii
post
Post #1





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował casperii 19.07.2015, 16:32:17
Go to the top of the page
+Quote Post
Daimos
post
Post #2





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
casperii
post
Post #3





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował casperii 20.07.2015, 17:25:34
Go to the top of the page
+Quote Post
ctom
post
Post #4





Grupa: Zarejestrowani
Postów: 321
Pomógł: 55
Dołączył: 19.04.2009

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
casperii
post
Post #5





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


http://php.net/manual/en/function.imagefilledrectangle.php
Go to the top of the page
+Quote Post
casperii
post
Post #7





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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..


Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
casperii
post
Post #9





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


Ż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?

Ten post edytował casperii 26.07.2015, 21:39:04
Go to the top of the page
+Quote Post
IProSoft
post
Post #10





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


  1. $i%2 == 0


  1. $dodaj +=30;


Ten post edytował IProSoft 26.07.2015, 21:43:27
Go to the top of the page
+Quote Post
casperii
post
Post #11





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


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)?

Ten post edytował casperii 27.07.2015, 00:37:42
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 21:06