Picturebox
Què és el control PictureBox?
El control PictureBox de VB.NET és fonamental per mostrar imatges a les aplicacions de Windows Forms. El control PictureBox s'utilitza per mostrar gràfics en diversos formats (com ara Bitmap, GIF, JPEG, PNG, etc.) en un formulari de Windows Forms. És un dels controls més simples, però essencial per a qualsevol aplicació que requereixi visualització d'imatges.
-
Visualització d'Imatges Fixes: Mostrar logotips, fons o imatges predefinides.
-
Galeria de Fotos: Crear aplicacions per mostrar imatges carregades per l'usuari.
-
Elements Gràfics Interactius: Actuar com a àrea clicable per iniciar una acció (mitjançant l'esdeveniment
Click). -
Jocs 2D Bàsics: Representar elements visuals o "sprites" en un joc simple.
Propietats
| Propietat | Descripció | Tipus de Dada |
| Image | Obté o defineix la imatge a mostrar dins del control. És la propietat més important. | Image object |
| SizeMode | Controla com es mostra la imatge dins els límits del control PictureBox. | PictureBoxSizeMode |
| ImageLocation | Obté o defineix la ruta d'accés o URL de la imatge. Utilitzat amb els mètodes Load o LoadAsync. |
String |
| BorderStyle | Obté o defineix l'estil de la vora del control (p. ex., FixedSingle, Fixed3D, None). |
BorderStyle |
| InitialImage | Obté o defineix la imatge que es mostra temporalment mentre la imatge principal es carrega de manera asíncrona. | Image object |
SizeMode
La propietat SizeMode és crucial per gestionar com l'àrea del PictureBox interactua amb la mida real de la imatge:
| Valor | Descripció |
| Normal | L'extrem superior esquerre de la imatge es col·loca a l'extrem superior esquerre del control. Si l'àrea del control és més petita que la imatge, es retalla. |
| StretchImage | La imatge s'estira o es redueix per encabir-se exactament a les dimensions del control. Això pot distorsionar la imatge. |
| AutoSize | El control PictureBox es redimensiona automàticament per coincidir amb la mida de la imatge. |
| CenterImage | La imatge es centra dins del control. Si és més gran, es retalla pels costats. |
| Zoom | La imatge es redimensiona proporcionalment (mantenint la seva ràtio d'aspecte) per encabir-se dins del control. Aquest és sovint el mode preferit. |
Mètodes
| Mètode | Descripció |
| Load | Carrega de manera síncrona la imatge especificada per la propietat ImageLocation o directament per un String de la ruta/URL. |
| LoadAsync | Carrega la imatge de manera asíncrona, evitant que la interfície d'usuari es bloquegi mentre es carrega un fitxer gran. |
| CancelAsync | Cancela una operació de càrrega d'imatge asíncrona en curs (LoadAsync). |
| Dispose | Allibera tots els recursos utilitzats pel control. |
Exemples VB.NET
Assumim un control PictureBox anomenat PictureBox1 al teu formulari.
Carregar una Imatge en temps execució
Pots carregar una imatge des d'un fitxer local utilitzant la propietat Image i el mètode Image.FromFile.
Imports System.Drawing ' Necessari per a la classe Image
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Ruta del fitxer d'imatge (ajusta la ruta al teu PC)
Dim rutaImatge As String = "C:\Rutes\AlesTevesImatges\logo.png"
Try
' 1. Carregar la imatge al control
PictureBox1.Image = Image.FromFile(rutaImatge)
' 2. Ajustar la mida de la imatge al control sense distorsió
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
' 3. Opcional: Afegir una vora
PictureBox1.BorderStyle = BorderStyle.FixedSingle
Catch ex As Exception
' Gestionar errors, per exemple si la ruta no és vàlida
MessageBox.Show("Error carregant la imatge: " & ex.Message)
End Try
End Sub
Utilitzar ImageLocation i Load
Si vols separar la definició de la ruta de la càrrega, o si utilitzes un URL:
Private Sub BtnCarregar_Click(sender As Object, e As EventArgs) Handles BtnCarregar.Click
' Defineix la ruta
PictureBox1.ImageLocation = "https://un-servidor.com/imatge_remota.jpg"
' Carrega la imatge
PictureBox1.Load()
' També pots utilitzar LoadAsync() per a càrrega asíncrona
' PictureBox1.LoadAsync()
End Sub
Creació dinàmica de PictureBoxs
La creació de controls de manera dinàmica permet que l'aplicació s'adapti a les necessitats de l'usuari, per exemple, mostrant tantes imatges com l'usuari vulgui seleccionar.
El procés consta de tres passos principals:
-
Declarar i Instanciar un nou objecte
PictureBox. -
Configurar les seves propietats (
Location,Size,Image, etc.). -
Afegir-lo a la col·lecció de controls del formulari (o un altre contenidor com un
Panel).
Exemple VB.NET
Aquest exemple crea diversos controls PictureBox basant-se en un bucle (o en el nombre que l'usuari hagi triat). Assumim que teniu un botó anomenat BtnAfegir al vostre formulari.
' Utilitzarem una llista per mantenir una referència als controls creats dinàmicament
Private PictureBoxesDinamics As New List(Of PictureBox)
Private Sub BtnAfegir_Click(sender As Object, e As EventArgs) Handles BtnAfegir.Click
' Utilitzem un bucle per crear 3 PictureBoxs d'exemple
For i As Integer = 1 To 3
' 1. Declarar i Instanciar el nou control PictureBox
Dim nouPictureBox As New PictureBox()
' 2. Configurar les seves propietats
' Assignar un nom únic
nouPictureBox.Name = "pbDinamic" & i.ToString()
' Definir la mida
nouPictureBox.Size = New Size(100, 100)
' Calcular la posició (els col·loca en fila)
nouPictureBox.Location = New Point(20 + ((i - 1) * 110), 50)
' Carregar una imatge de prova (reemplaça amb una ruta vàlida o My.Resources)
' NOTA: Image.FromFile bloqueja el fil, utilitza My.Resources si l'imatge és al projecte
Try
' Carrega des d'una ruta, utilitza un fitxer petit per a l'exemple
nouPictureBox.Image = Image.FromFile("C:\Rutes\AlesTevesImatges\miniatura" & i.ToString() & ".jpg")
Catch ex As Exception
nouPictureBox.BackColor = Color.LightGray ' Fons de color si no es troba la imatge
End Try
' Establir el mode de visualització de la imatge
nouPictureBox.SizeMode = PictureBoxSizeMode.Zoom
' Opcional: Assignar un esdeveniment (p. ex., clic)
AddHandler nouPictureBox.Click, AddressOf PictureBox_Click
' 3. Afegir el nou control a la col·lecció Controls del formulari (Me)
Me.Controls.Add(nouPictureBox)
' Guardar la referència a la llista per a un accés futur
PictureBoxesDinamics.Add(nouPictureBox)
Next
End Sub
' Controlador d'esdeveniments per a tots els PictureBox dinàmics
Private Sub PictureBox_Click(sender As Object, e As EventArgs)
' "sender" és el control PictureBox que ha estat clicat
Dim pbClicat As PictureBox = DirectCast(sender, PictureBox)
MessageBox.Show("Has clicat el PictureBox: " & pbClicat.Name)
' Pots canviar-li el color per indicar que ha estat clicat
pbClicat.BorderStyle = BorderStyle.Fixed3D
End Sub
Aquest exemple no només crea els controls dinàmicament, sinó que també els assigna un gestor d'esdeveniments (PictureBox_Click) perquè l'usuari pugui interactuar amb ells un cop creats.
Eliminar una imatge associada a PictureBox
Eliminar de forma segura una imatge d'un control PictureBox i alliberar els recursos del sistema associats és un pas crucial, especialment quan es treballa amb moltes imatges (creació dinàmica) o aplicacions de llarga durada. El control PictureBox conté una referència a un objecte de la classe Image (o una de les seves derivades, com Bitmap). Aquests objectes fan ús de recursos del sistema operatiu (memòria, gestors de fitxers). Si simplement assignes Nothing a la propietat Image, l'objecte Image podria romandre a la memòria durant un temps fins que el col·lector d'escombraries de .NET (Garbage Collector - GC) decideixi alliberar-lo.
La manera segura i immediata d'alliberar els recursos és utilitzar el mètode Dispose().
Passos en VB.NET
Aquí teniu el codi per garantir que l'objecte Image s'elimina correctament abans de desassignar-lo del PictureBox.
Private Sub EliminarImatgeDePictureBox(ByVal pb As PictureBox)
' 1. Comprovar si hi ha una imatge assignada
If pb.Image IsNot Nothing Then
' 2. Guardar una referència a l'objecte Image actual
Dim imatgeAEliminar As Image = pb.Image
' 3. Eliminar la referència de l'objecte Image del PictureBox
' Això fa que el PictureBox ja no mostri res i es prepari per a l'alliberament.
pb.Image = Nothing
' 4. Alliberar immediatament els recursos del sistema
' El mètode Dispose() allibera la memòria i els gestors de fitxers.
imatgeAEliminar.Dispose()
' Opcional: Netejar qualsevol altre efecte visual
pb.BorderStyle = BorderStyle.None
pb.BackColor = Color.Empty ' o qualsevol color de fons desitjat
End If
End Sub
' Crida a la funció de neteja segura
EliminarImatgeDePictureBox(PictureBoxPrincipal)
Per què és important Dispose()?
-
Alliberament de Recursos: Quan carregues una imatge des d'un fitxer utilitzant
Image.FromFile, el sistema operatiu manté un bloqueig al fitxer. Si no crides aDispose(), aquest fitxer pot romandre bloquejat i no podràs, per exemple, moure, renombrar o eliminar-lo des d'altres programes (o el teu propi codi) fins que el GC no actuï. -
Prevenció de Memory Leaks: En aplicacions que carreguen i descarreguen imatges repetidament, no utilitzar
Dispose()pot provocar una acumulació excessiva d'objectesImageantics a la memòria, cosa que redueix el rendiment de l'aplicació.
En resum, la clau per a una eliminació segura i eficient és assegurar-se que l'objecte de la imatge cridi a Dispose() abans d'assignar Nothing al PictureBox.Image.