Newsgroup: it.comp.lang.visual-basic
Titolo: [?] - Ridimensionare un'immagine ALIAS Maledette scale

Ciao a Tutti,
    Sto cercando di caricare in una PictureBox un'immagine. Se l'immagine
supera in altezza e/o in larghezza la dimensione della PictureBox voglio che
sia ridimensionata in proporzione senza Stretch.
    Dal Sito Comune ho trovato un po di sorgenti, vi riporto la sub che
dovrebbe fare l'operazione desiderata.
    I controlli che sono presenti sul form sono 2
        una PictureBox (chiamata nella sub PBOX)
        un controllo Image (chiamato nella sub IMGFoto)
Sub VediFoto(PercorsoFoto As String)
Dim irapp, irapp2
Dim iw As Integer
Dim ih As Integer
Dim ix As Integer
Dim iy As Integer
Dim MaxW As Integer
Dim MaxH As Integer
    MaxW = PBOX.Width - 10
    MaxH = PBOX.Height - 10
    IMGFoto.Picture = LoadPicture(PercorsoFoto)
    If (IMGFoto.Width > PBOX.Width) Or (IMGFoto.Height > PBOX.Height) Then
        irapp = IMGFoto.Width / IMGFoto.Height
        irapp2 = MaxW / MaxH
        If irapp >= 1 Then
           If irapp2 >= irapp Then
              ih = MaxW
              iw = MaxH * irapp
              iy = 0
              ix = (MaxW - iw) / 2
           Else
              iw = MaxW
              ih = MaxW / irapp
              ix = 0
              iy = (MaxH - ih) / 2
              End If
        Else
           If irapp2 <= irapp Then
              iw = MaxW
              ih = MaxW / irapp
              ix = 0
              iy = (MaxH - ih) / 2
           Else
              ih = MaxH
              iw = MaxH * irapp
              iy = 0
              ix = (MaxW - iw) / 2
           End If
        End If
    Else
        iw = IMGFoto.Width
        ih = IMGFoto.Height
        ix = (MaxW - iw) / 2
        iy = (MaxH - ih) / 2
    End If
    PBOX.Picture = Nothing
    PBOX.PaintPicture IMGFoto.Picture, ix, iy, iw, ih
End Sub
    Ho manipolato un pochino l'esempio che ho trovato sul sito comune,
perchè la PictureBox si deve adattare alle dimensioni della finestra che la
contiene e la finestra può essere ridimensionata.
    Questa sub però non riesce sempre a ridimensionare bene le immagini che
devono essere caricate.
    Credo che sia un problema di Scale, ma facendo qualche prova non sono
riuscito ad avere nessun risultato.
Mi date una mano ?
        Grazie 1000 per ogni eventuale risposta.
    Ciao, Rocco

 contiene e la finestra può essere ridimensionata.
Credo che il problema stia qui. Come decidi le dimensioni della PictureBox?
Il ridimensionamento deve essere comunque proporzionale alle dimensioni
originali della tua immagine di partenza.
Secondo me ti conviene utilizzare una variabile unica che ti faccia da
moltiplicatore per la X e la Y in modo da mantenere fisso il rapporto delle
dimensioni.
Esemplifico: crea un progetto nuovo che contenga una picturebox di nome
Picture1 e una image di nome Image1. Poi inserisci una qualunque bitmap un
po' grandina in Picture1. Adesso incolla questo codice:
Option Explicit
Private Sub Form_Load()
   Picture1.AutoSize = True
   Picture1.Visible = False
   Image1.Stretch = True
   Image1.Picture = Picture1.Picture
End Sub
Private Sub Form_Resize()
   Dim ZoomRatio As Single
   ZoomRatio = CalcolaZoomRatio(Picture1.ScaleWidth, _
               Picture1.ScaleHeight, Me.ScaleWidth, _
               Me.ScaleHeight)
   Image1.Move 0, 0, Picture1.Width * ZoomRatio, _
               Picture1.Height * ZoomRatio
End Sub
Private Function CalcolaZoomRatio(lLarghezzaBase As Long, _
          lAltezzaBase As Long, lLarghezzaDestinazione As Long, _
         lAltezzadestinazione As Long) As Single
   Dim ZoomRatioY As Single
   CalcolaZoomRatio = lLarghezzaDestinazione / lLarghezzaBase
   ZoomRatioY = lAltezzadestinazione / lAltezzaBase
   If ZoomRatioY < CalcolaZoomRatio Then
      CalcolaZoomRatio = ZoomRatioY
   End If
End Function
Ridimensiona un po' la form, e noterai come l'immagine mantenga sempre le
proporzioni, ma non sia affatto grande come la form stessa.
Solo una delle due dimensioni (la minore) viene tenuta come riferimento.
Questo "problema" non è evitabile se vuoi mantenere le proporzioni
dell'immagine. Al massimo puoi limitare l'inconveniente centrando l'immagine
così ridimensionata all'interno della form stessa.
Questo approccio ti dà anche un altro vantaggio. Sai esattamente che
percentuale di zoom stai utilizzando (sta in ZoomRatio) e puoi mostrarla
all'utente. Molto professionale. :-)
Ciao
*Roby*

Grazie 1000,
    č esattamente quello che mi serviva.
    L'ho manipolato un poco (č un vizio scusa ;-) ma la funzione base resta
la tua.
Ciao, Rocco