Przeskaluj po wysokości i wklej na drugi obrazek o prawidłowych rozmiarach.
Jeśli miniaturka ma mieścić się w rozmiarze 150x100px (uproszczone), a twój obrazek ma 120x100px po przeskalowaniu według wysokości, to tworzysz obrazek 150x100 i wklejasz przeskalowany image w miejscu:
X: round((150-120)/2)
Y: 0
Dobra, z kodem trochę namotałem. Działająca wersja:
header('Content-Type: image/png'); //wysyłamy nagłówek
$tmp_image = imagecreatefrompng('test.png'); //miniaturka przeskalowana byle jak po wysokości
$final_image = imagecreatetruecolor($destx, $desty); //miniaturka o prawidłowym rozmiarze
$destx = 100; //wymarzona szerokość
$desty = 100; //wymarzona wysokość
$color = imagecolorallocate($final_image, 200, 200, 200); //alokujemy szary kolor
imagefill($final_image, 0, 0, $color); //malujemy cały finalny obraz na szaro
$sizex = imagesx($tmp_image); //pobieramy rozmiar x obrazka przeskalowanego byle jak
$sizey = imagesy($tmp_image); //pobieramy rozmiar y obrazka przeskalowanego byle jak
//na finalny obraz wklejamy ten, przeskalowany po wysokości, tak żeby znalazł się na środku
imagecopy($final_image, $tmp_image, round(($destx-$sizex)/2), 0, 0, 0, $sizex, $sizey);
imagepng($final_image); //wyświetlamy obraz
$tmp_image to obrazek przeskalowany po wysokości, z nieprawidłową szerokością.
Dla obrazka:
<font size="1">Transparent PNG (80x100 px)</span>
Wynik to:
<font size="1">PNG (100x100 px)</span>
Szara obwódka celowo, bo białej nie byłoby tu widać.
Przetestować sobie można tutaj.
Edit: I co, działa?