Il 3° parametro è il "hints". -1 non mi pare uno dei valori validi. Vedi documentazione.
L'immagine originale è quadrata? Per sicurezza, prendi width/height della immagine SCALATA.
Perché usi più volte getGraphics()/createGraphics() ??
Usane solo uno (il createGraphics perché dà già un Graphics2D), tieni il Graphics2D in UNA variabile. Usala per disegnare. E alla fine dei disegni fai dispose(). Punto.
C'è una questione un po' "subdola". Il Toolkit carica le immagini in modo asincrono. Vuol dire che anche se la immagine fosse molto grande, il getImage ritorna quasi subito e poi il caricamento avviene in seguito in modo appunto asincrono.
Problema: quando fai il drawImage non è certo che la immagine sia completa. Dovresti usare un MediaTracker per attendere il completamento del caricamento.
P.S. nel drawString il x/y NON è il centro perfetto della stringa. Invece è il punto del "baseline" al primo carattere.