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)

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)
// Kod pisany na kolanie - przetestuj!
$x_d=$max_x; // Narzucone
$rescale = $x_d/$x_s;
$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ę.