Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem, ze zmianą rozdzielczości/rozmiaru zdjęcia w PHP
Forum PHP.pl > Forum > PHP
Patras3
Witam,
Chciałbym prosić o poradę, w jaki sposób mógłbym użyć skyptu PHP, by zmieniał rozdzielczość zdjęcia, jednocześnie zachowując jakieś proporcje oraz fakt, że np wysokość, szerokość musi być z jakiegoś konkretnego przedziału?
Używam tego skryptu:
  1. [...] $filename = './images/'.$p_nazwa_zm.'';
  2. list($width, $height) = getimagesize($filename);
  3. $new_width = 350;
  4. $new_height = 500;
  5. $image_p = imagecreatetruecolor($new_width, $new_height);
  6. $image = imagecreatefromjpeg($filename);
  7. imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
  8. $galleryPath = 'images/';
  9. unlink("images/".$p_nazwa_zm);
  10. imagejpeg( $image_p, $galleryPath.$p_nazwa_zm, 100 );

Jak można zobaczyć na stronie, na której to wykorzystuję: LINK - przy różnych osobach wrzucających, stały rozmiar okazał się porażką sad.gif
abort
Na rozmiary zdjęcia wrzucanego nie masz wpływu - może to być 320x200 albo 2048x1536, albo nawet 10240x1280 (taka mega panorama). Oznaczmy rozdzielczości: $x_s, $y_s ("s" od "source")
Twoim zadaniem jest:
1. określenie, czy przzeskalowujesz zdjęcia do konkretnego wymiaru poziomego, czy pionowego. Tu uwaga na boku: pionowy rozmiar boli mniej - user sobie przewinie stronę w pionie, bo do tego jest przyzwyczajony. Z przewijaniem w poziomie bywa gorzej (mniejsze przyzwyczajenie, a jak do przewijania w poziomie dojdzie przewijanie w pionie, to koniec świata) smile.gif Zakładamy więc, że masz określone maksymalne X, niech będzie $x_max=640px.
2. przeskalowywujemy zdjęcie ($x_d, $y_d - docelowe rozmiary)
  1. // Kod pisany na kolanie - przetestuj!
  2. $x_d=$max_x; // Narzucone
  3. $rescale = $x_d/$x_s;
  4. $y_d= (int)($y_s * $rescale); // rzutujemy na int - wymiar musi być całkowity.

3. [KONTROLA OBLICZEŃ!] Obliczasz sobie współczynnik $n=$y_s/$x_s (albo $x_s/$y_s - co na jedno wychodzi) oryginalnego zdjęcia - ten sam współczynnik dla zdjęcia przeskalowanego $x_d/$y_d będzie identyczny (modulo zaokrąglenia)

4. Zapisujemy/wyświetlamy/przesyłamy zdjęcie.

Osobiście uważam, że używanie przedziałów dla zdjęć mija się z celem - albo mamy narzucone konkretne wymagania na maksymalną rozdzielczość X, albo na maksymalną Y, albo (co nie jest dziwne) na obie naraz - robimy zmniejszanie tak, aby:
1. zostały zachowane proporcje (chyba że wymagania są inne - ale u Ciebie jak widać są właśnie takie)
2. żaden wymiar nie został prekroczony.

Innymi słowy, jeśli masz zdjęcie z aparatu i chcesz je dopasować np. do wielkości ekranu, to inne przeskalowanie (inną skalę) będzie dla zdjęcia poziomego (landscape), a inne dla pionowego (portrait). To też musisz wziąć pod uwagę.
Patras3
Wielkie dzięki, zaraz wezmę się za testowanie, to chyba w 100% rozwiąże mój problem:)
Właśnie zakres szerokości/wysokości chodziło mi o maksymalną wielkość smile.gif
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.