Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][GD] Odstęp od ramki i inteligentne skalowanie
Forum PHP.pl > Forum > Przedszkole
wojtek19115
Witajcie, pisze skrypt podobny do demotywatorów i mam problem dotyczący odstępu od ramki oraz skalowania.

Oto kawałek mojego kodu
  1. <?php
  2. header("Content-type: image/jpeg");
  3. //Obrazek
  4. $obrazek = imagecreatefromjpeg("test.jpg");
  5. //Max szerokość
  6. $max = 500;
  7. //Wymiary X i Y obrazka
  8. $x = imagesx($obrazek);
  9. $y = imagesy($obrazek);
  10. //Tło
  11. $image = imagecreatetruecolor(($max + 50), ($y + 200));
  12. //Czarne tło
  13. $bg = imagecolorallocate($image, 0, 0, 0);
  14. //Zmiana rozdziałki
  15. if ($x > 475) {
  16. imagecopyresized($obrazek, $obrazek, 0, 0, 0, 0, 500, $y, $x, $y);
  17. }
  18. //Nałożenie Obrazka
  19. imagecopymerge($image,$obrazek,25,30,0,0,$max,$y,100);
  20. //Wyświetlenie
  21. imagejpeg($image,"",100);
  22. ?>

I mam wielką prośbę jak inteligentnie skalować rozmiar obrazka bo np obrazek 1600x1200 zmienia szerokość poprawnie ale strasznie rozjeżdża wysokość dlatego szukam wzoru na skalowanie obrazka taki jak np GIMP'ie gdy podamy max szerokość automatyczne dostosowuje wysokość.

I jak idealnie ustawić odstęp od lewego i prawego rogu obrazka biorąc pod uwagę obrazki =500 , <500, >500

Z góry dziękuję wink.gif
sada
W czwartej klasie podstawówki były chyba proporcje

Cytat
I jak idealnie ustawić odstęp od lewego i prawego rogu obrazka biorąc pod uwagę obrazki =500 , <500, >500


odstęp od czego?
wojtek19115
Odstęp od ramki, ramkę generuje $max czyli wartość 500 + 50 aby uzyskać idealne wyśrodkowanie odstęp od lewej ustawiam na 25 ale gdy obrazek jest mniejszy od 500 całe wyśrodkowanie nie działa a nie chcę generować z rozmiaru obrazka bo wtedy na napis miejsca nie ma
Sephirus
Ok zasada jest prosta:

Musisz sobie na stałe założyć czy idziesz na height czy width.

Jedna z tych wartości musi być określona jako maksymalna. Jeżeli ustawisz width na na przykład 500px to większego być nie może i wtedy musisz skalować height tak aby było proporcjonalne do width. Przykład:

Ustalamy, że maksymalny width to 500px. Ktoś wrzuca zdjęcie o rozmiarze 1000x600px.

  1. $maxW = 500;
  2. $w = 1000;
  3. $h = 600;
  4.  
  5. $newW = 500;
  6. $newH = round($h * $maxW/$w);


Zatem obrazek będzie przeskalowany na $newW x $newH wink.gif Matematyka jest prosta:

NOWA_WYSOKOŚĆ = STARA_WYSOKOŚĆ x (NOWA_SZEROKOSC/STARA_SZEROKOSC).

Innymi słowy mnożysz oryginalną wysokość obrazka przez stosunek nowo ustalonej szerokości do oryginalnej szerokości ;P Jak width utniesz o pół to i proporcjonalnie o to samo musisz obciąć height aby tzw aspect ratio był zachowany wink.gif

EDIT: zapomniałem o tej ramce...

Zasada też jest prosta. Dla mniejszych obrazków jak i dla tych co się mieszczą proponuje zrobić tak:

Powiedzmy że szerokość wyjściowego obrazka to też 500px i chcesz mieć minimum marginesy na 50px. Stosujesz metodę przedstawioną przeze mnie wyżej dla większych obrazków ale dla $maxW = 400 (no bo marginesy mają mieć po 50 a 500-2x50 = 400). Dla mniejszych w ogóle nie musisz jej stosować. I teraz tak. Wartość X gdzie ma być wstawiony obrazek to nic innego niż:

  1. $x = 50 + (400 - $w)/2;


gdzie $w = to wyjściowa szerokość oryginalnego obrazka (po ewentualnym użyciu metody #1)

Tyle wink.gif

HTH wink.gif
wojtek19115
Wielkie dzięki za naprowadzenie na rozwiązanie biggrin.gif
Oto efekt końcowy mojego skryptu:
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.