2013-03-20 21 views
11

Sto cercando di fare in modo che un'immagine in un controllo PictureBox aggiusti automaticamente le sue dimensioni in base alla dimensione della finestra, ma mantenga le proporzioni. Finora l'impostazione di SizeMode su StretchImage causa l'allungamento dell'immagine per adattarsi all'intero controllo PictureBox. Questo ignora le proporzioni, che non è quello che voglio.Ridimensiona un'immagine in un PictureBox fino a dimensioni superiori, pur mantenendo le proporzioni?

È possibile mantenere le proporzioni, ma allungare ancora l'immagine al massimo può andare dinamicamente quando le dimensioni della forma cambiano? È possibile fare questo e sono ancora centrati? Immagino di poter ricreare l'immagine in memoria ogni volta che la finestra viene ridimensionata, ma questa sembra una cattiva idea.

risposta

16

Credo che questo sia l'effetto di PictureBoxSizeMode.Zoom. La documentazione dice che:

La dimensione dell'immagine viene aumentata o diminuita mantenendo il rapporto di formato.

Si imposta questo sulla proprietà PictureBox.SizeMode. Nella sezione "Note" della documentazione relativa a tale funzione viene inoltre indicato:

L'utilizzo del valore Zoom fa sì che l'immagine sia allungata o ridotta per adattarsi alla PictureBox; tuttavia, le proporzioni dell'originale vengono mantenute.

È possibile, naturalmente, impostare la proprietà PictureBox.SizeMode sia nel progettista finestra Proprietà o nel codice (ad esempio, nel costruttore del modulo):

myPictureBox.SizeMode = PictureBoxSizeMode.Zoom; 

Se questo non fa esattamente quello che vuoi, potresti sempre implementare la logica di ridimensionamento da solo. La tua preoccupazione è che ricreare l'immagine nella memoria ogni volta che il controllo viene ridimensionato "sembra una cattiva idea", ma non sono sicuro del motivo per cui sembra così. L'unico problema sarebbe se non fossi attento a distruggere oggetti grafici inutilizzati, come il vecchio Bitmap. Non solo questi oggetti contengono risorse non gestite che devono essere liberate, inizierai a esercitare enormi quantità di pressione sulla memoria se le lascerai perdere.

In alternativa, per evitare la creazione di bitmap temporanei, è possibile eseguire ciò che il controllo PictureBox probabilmente esegue internamente e utilizzare il metodo Graphics.DrawImage per gestire lo stretching. Se si passa un rettangolo, esso ridimensiona automaticamente l'immagine per adattarla all'interno del rettangolo.

+0

Grazie, in qualche modo ho perso completamente l'impostazione "Zoom".Questo fa esattamente quello che voglio, anche se è bello conoscere gli interni che hai spiegato, specialmente Graphics.DrawImage - Potrei averne uno in futuro ... – Jon

2

Modificare il "SizeMode" su Zoom. Come suggerisce il nome, "StretchImage" lo allungherà per adattarsi al file immagine. Un facile processo di eliminazione ti avrebbe dato lo stesso risultato.

2

In base allo PictureBoxSizeMode documentation è possibile specificare PictureBoxSizeMode.Zoom per mantenere l'immagine in modo che mantenga le proporzioni. Ingrandirà il più grande possibile senza che nessuna parte dell'immagine trabocchi dalla finestra immagine.

E si può giocare con lo Dock property (impostazione DockStyle.Full) per ridimensionare la casella immagine in base alle dimensioni del contenitore.

-4

È possibile aggiungerlo a un controllo del browser Web. Usando il tasto Ctrl e il tasto del mouse puoi ingrandire quanto vuoi.