Non avete considerato il limite di 20 caratteri. Versione con il limite, e che ignora eventuali "finte estensioni":

Codice PHP:
$orig "tizio_caio_sempronio_etuttiglialtri.jpg";

preg_match("/^(.{0,20}).*(\.[^.]+)$/"$orig$result);

$new $result[1] . "xxxyyyzzz";
$ext $result[2];

$final $new $ext;
echo 
$final
Mi piacciono le regexp