me deu uma louca aqui e mudei isso...
$larguran = $larguran = ($largurao * $alturan) / $alturao; // largura nova $alturan = 300; // altura nova
para isso...
$alturan = 300; // altura nova $larguran = ($largurao * $alturan) / $alturao; // largura novaisso mesmo hahaha
só troquei as variáveis posição...
agora funcionou...
e sobre a qualidade da imagem também achei a solução...
imagejpeg ($nova, '', 95);
* Editado
o cálculo ta certo...so por curiosidade, o que aconteceria se o resultado dessa conta for fracao?
num me lembro de ter visto imagem com 103,2px x 115,4px, por exemplo.
ate porque o pixel eh a menor unidade que forma uma imagem no monitor, nao pode ser dividido.
por ex:
$larguran = ($largurao(640) * $alturan(300)) / $alturao(480)
640 x 300 / 480 = 400...