Samozřejmě je dost těžké ověřit kód jen na pohled, ale první, co mi padlo do oka, je, že nevidím naplněné proměnné $max_width a $max_height . Pak by ovšem $x_ratio a $y_ratio nenabyly číselné hodnoty - odtud by mohly pocházet blbé hodnoty $tn_width,$tn_height , což je předmětem hlášení.
Ale v žádném případě netvrdím, že jsem problém vyřešil, je to jen tip na první pohled.