Οφείλω να επισημάνω δύο σοβαρά λάθη που έχει η δική σου υλοποίηση:
α)δεν λαμβάνεις καθόλου υπόψην σου το padding,το οποίο όμως λαμβάνει υπόψην του το PictureBox όταν επιχειρεί να υπολογίσει το Rectangle στο οποίο θα σχεδιάσει την εικόνα.Άρα αν βάλεις padding οτιδήποτε άλλο εκτός από μηδέν θα σου βρει λάθος τιμές.Το σοβαρότερο λάθος όμως είναι το
β)η συνθήκη που υπολογίζει με βάση ποια διάσταση του picturebox πρέπει να γίνει το scaling είναι λάθος.
Εσύ την ορίζεις ως:
If zoomImageHeight > pBox.ClientRectangle.Height Then
' Use client rectangle height as reference
Το PictureBox όμως δεν κάνει το ίδιο.Αν αναπτύξεις την Math.Min και αποσπάσεις το αντίστοιχο κομμάτι κώδικα με το δικό σου:
If (pBox.ClientRectangle.Width / img.Width) > (pBox.ClientRectangle.Height / img.Height) Then
' Use client rectangle height as reference
Νομίζω ότι η διαφορά είναι εμφανής και ο μόνος λόγος που δεν το έχεις διαπιστώσει ακόμα (αλήθεια,πως γνωρίζεις ότι οι τιμές που παίρνεις είναι σωστές;) είναι θέμα τύχης περισσότερο.
EDIT:Δεν έκανα τα μαθηματικά μου και την πάτησα.Κράτα μόνο το α) λοιπόν και συγγνώμη για την αβλεψία μου.