Skip to main content

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.

Fragmento de código
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:

Fragmento de código
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:

  1. Declarar i Instanciar un nou objecte PictureBox.

  2. Configurar les seves propietats (Location, Size, Image, etc.).

  3. 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.

Fragmento de código
' 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.

Fragmento de código
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
Fragmento de código
' Crida a la funció de neteja segura
EliminarImatgeDePictureBox(PictureBoxPrincipal)

Per què és important Dispose()?

  1. 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 a Dispose(), 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ï.

  2. Prevenció de Memory Leaks: En aplicacions que carreguen i descarreguen imatges repetidament, no utilitzar Dispose() pot provocar una acumulació excessiva d'objectes Image antics 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.