PS:NON SO' PERCHE' MA LA FUNZIONE CHE TI HO POSTATA NON VIENE VISUALIZZATA CORRETTAMENTE
IMPORTANTE: ATTENTO CHE QUANDO HO POSTATO IL CODICE SI E' MODIFICATO QUINDI NELLA FUNZIONE BBCODE CI SONO DEGLI ERRORI NON VOLUTI PURTROPPO!!!
Paradossale: parlando di bbcode siamo incappati in un bug del bbcode di html.it!!

Sbirciando il tuo codice ho visto questa riga

Codice PHP:
'[img]$1[/img]'
in pratica la conversione di [img] avviene con una immagine di larghezza di 500px... immagino che serva per preservare il layout.
Non si tiene conto della grandezza originale... questo ti comporta che anche quando sono postate img piccole avranno tale larghezza con i relativi effetti di sgranamento.
Io ho risolto il problema applicando una funzioncina (copiata in rete ma nn trovo più il link) che qualora supera l'altezza e la larghezza massima consentita le ridimensiona secondo tale misura.

Codice PHP:
function check_img($stringa,$width_max,$height_max){
        if(
strstr($stringa,"alt=image>")){ //se nel messaggio c'è un'immagine
            
$stringa_exp explode("alt=image>",$stringa); //suddividi il messaggio quando trovi "alt=image>"
            
while(list($i,$item) = each($stringa_exp)){
                
//L'ultima stringa non deve essere processata ma direttamente inserita per l'uscita
                
if($i == count($stringa_exp)-1){
                    
$stringa2 .= $item;
                    break;
                }
                
$inizio strpos(rtrim($item), "[img]);//trova la posizione di [/img] $width_max || $img[1] > $height_max){
                    
$end_tag = "[img],$end_tag,$item.[/img]");
            }
        }else 
$stringa2 = $stringa;
        
$vettore = array($stringa2,$stringa1,$img[0],$img[1]);
        return 
$vettore[0];
    } 
Non sò se ti può essere utile...