Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - PictureBox e ProgressBar

Guida al Visual Basic .NET

Capitolo 60° - PictureBox e ProgressBar

<< Precedente Prossimo >>

PictureBox

La PictureBox è uno di quei controlli visibili solamente nel designer, poichè i suoi contorni, di default, sono invisibili. L'unica caratteristica che la rende visibile a runtime è la sua proprietà fondamentale, Image. Infatti, questo controllo può contenere un'immagine: di solito viene usata per posizionare loghi, banner o scritte all'interno dell'interfaccia di un programma. Le proprietà più importanti sono:

  • ErrorImage : l'immagine visualizzata qualora non sia possibile caricare un'immagine con la proprietà Image
  • Image : l'immagine visualizzata
  • InitialImage : l'immagine visualizzata all'inizio, prima che sia impostata qualsiasi altra immagine con la proprietà Image
  • SizeMode : modalità di ridimensionamento dell'immagine. Può assumere cinque valori: Normal (l'immagine rimane delle dimensioni normali, e ignora ogni ridimensionamento della picturebox: per questo può anche venire tagliata), StretchImage (l'immagine si ridimensiona a seconda della picturebox, assumendone le stesse dimensioni), AutoSize (la picturebox si ridimensiona sulla base dell'immagine contenuta), CenterImage (l'immagine viene sempre posta al centro della picturebox, ma mantiene le proprie dimensioni iniziali), Zoom (l'immagine si ridimensiona sulla base della picturebox, ma mantiene sempre lo stesso rapporto tra larghezza e altezza)

ErrorImage, Image e InitialImage sono proprietà di tipo Image: quest'ultima è una classe astratta e quindi non esiste mai veramente, anche se espone comunque dei metodi statici per il caricamento delle immagini. La classe che rappresenta veramente e materialmente l'immagine è System.Drawing.Bitmap, o solo Bitmap per gli amici. Nonostante il nome suggerisca diversamente, essa fa da wrapper a un numero elevato di formati di immagini, tra cui bmp, gif, jpg, png, exif, emf, tiff e wmf. In questo capitolo userò tale classe in modo molto particolare, quindi è meglio prima analizzarne i membri:

  • Classe astratta Image
    • FromFile(File) : carica un'immagine da File e ne restituisce un'istanza
    • FromStream(Stream) : carica un'immagine dallo stream Stream e ne restituisce un'istanza (per ulteriori informazioni sugli stream, vedere capitolo 56)
    • FromHbitmap : carica un'immagine a partire da un puntatore che punta al suo indirizzo in memoria
    • HorizontalResolution : risoluzione sull'asse x, in pixels al pollice (=2.54cm)
    • PixelsFormat : restituisce il formato dell'immagine, sottoforma di enumeratore
    • RawFormat : restituisce il formato dell'immagine, in un oggetto ImageFormat
    • RotateFlip(F) : ruota e/o inverte l'immagine secondo il formato F, esposto da un enumeratore codificato a bit
    • Save(File) : salva l'immagine sul file File: l'estensione del file influenzerà il metodo di scrittura dell'immagine
    • Size : dimensione dell'immagine
    • VerticalResolution : risoluzione sull'asse y, in pixels al pollice
  • Classe derivata Bitmap
    • GetPixel(X, Y) : restituisce il colore del pixel alle coordinate (X, Y), riferite al margine superiore sinistro
    • MakeTransparent(C) : rende il colore C trasparente su tutta l'immagine
    • SetPixel(X, Y, C) : imposta il colore del pixel alle coordinate (X, Y) a C
    • SetResolution(xR, yR) : imposta la risoluzione orizzontale su xR e quella verticale su yR, entrambe misurate in punti al pollice

 

ProgressBar

La ProgressBar è la classica barra di caricamento, usata per visualizzare sull'interfaccia lo stato di un'operazione. Le proprietà principali sono poche:

  • Maximum : il valore massimo rappresentabile dal controllo
  • Minimum : il valore minimo rappresentabile dal controllo
  • Step : valore che definisce il valore di incremento quando viene richiamata il metodo PerformStep
  • Style : proprietà enumerata che indica lo stile della barra. Può assumere tra valori: Block (a blocchi), Continuos (i blocchi possono venire tagliati, a seconda delle percentuale) e Marquee (un blocchetto che si muove da sinistra a destra, che rappresenta quindi un'operazione in corso della quale non si sa lo stato)
  • Value : il valore rappresentato

 

Esempio: Bianco e nero

L'esempio di questa lezione è un programma capace di caricare un'immagine, convertirla in bianco e nero, e poi risalvarla sullo stesso o su un altro file. I controlli da usare sono:

  • Una PictureBox, imgPreview, ancorata a tutti i bordi, con SizeMode = StrecthImage
  • Un Button, cmdLoad, Text = "Carica", Anchor = Left Or Bottom
  • Un Button, cmdSave, Text = "Salva", Anchor = Bottom
  • Un Button, cmdConvert, Text = "Converti", Anchor = Right Or Bottom
  • Una ProgressBar, prgConvert, Style = Continuos

Disposti come in figura:

PictureBox.jpg
Ecco il codice:

Class Form1
    'Funzione che converte un colore in scala di grigio
    Private Function ToGreyScale(ByVal C As Color) As Color
        'Per convertire un colore in scala di grigio è sufficiente
        'prendere le sue componenti di rosso, verde e blu (red,
        'green e blue), farne la media aritmetica e quindi
        'assegnare tale valore alle nuove coordinate RGB del
        'colore risultante

        'Ottiene le componenti (coordinate RGB)
        Dim Red As Int32 = C.R
        Dim Green As Int32 = C.G
        Dim Blue As Int32 = C.B
        'Fa la media
        Dim Grey As Int32 = (Red + Green + Blue) / 3

        'Quindi crea un nuovo colore, mettendo tutte le
        'componenti uguali alla media ottenuta
        Return Color.FromArgb(Grey, Grey, Grey)
    End Function

    Private Sub cmdLoad_Click(ByVal sender As System.Object, _ 
        ByVal e As System.EventArgs) Handles cmdLoad.Click
        'Per ulteriori informazioni sui controlli OpenFileDialog e 
        'SaveFileDialog vedere capitolo relativo
        Dim Open As New OpenFileDialog
        Open.Filter = "File immagine|*.jpg;*.jpeg;*.gif;*.png;*.bmp;" & _
            "*.tif;*.tiff;*.emf;*.exif;*.wmf"

        If Open.ShowDialog = Windows.Forms.DialogResult.OK Then
            'Apre l'immagine, caricandola dal file selezionato
            'nella finestra di dialogo tramite la funzione
            'statica FromFile
            imgPreview.Image = Image.FromFile(Open.FileName)
        End If
    End Sub

    Private Sub cmdSave_Click(ByVal sender As System.Object, _ 
        ByVal e As System.EventArgs) Handles cmdSave.Click
        'Se c'è un'immagine da salvare, la salva
        If imgPreview.Image IsNot Nothing Then
            Dim Save As New SaveFileDialog
            Save.Filter = "File Jpeg|*.jpeg;*.jpg|File Bitmap|*.bmp|" & _
                "File Png|*.png|File Gif|*.gif|File Tif|*.tif;" & _
                "*.tiff|File Wmf|*.wmf|File Emf|*.emf"

            If Save.ShowDialog = Windows.Forms.DialogResult.OK Then
                'Dato che la proprietà Image è di tipo Image, usa 
                'il metodo statico Save per salvare l'immagine
                imgPreview.Image.Save(Save.FileName)
            End If
        End If
    End Sub

    Private Sub cmdConvert_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdConvert.Click
        'Prima si converte l'immagine in Bitmap, dato che Image
        'è una classe astratta
        Dim Image As Bitmap = imgPreview.Image
        'Variabile ausiliaria per i calcoli
        Dim TempColor As Color

        'Attenzione!
        'Alcuni formati non supportano SetPixel, come il formato
        'Gif. Controllare di passare immagini di formato adeguato

        'Itera su ogni pixel, e lo cambia di colore
        'Scorre le righe di pixel una alla volta
        For X As Int32 = 0 To Image.Width - 1
            'Quindi ogni pixel nella riga
            For Y As Int32 = 0 To Image.Height - 1
                'Converte il colore
                TempColor = Image.GetPixel(X, Y)
                TempColor = ToGreyScale(TempColor)
                Image.SetPixel(X, Y, TempColor)
            Next
            'Imposta il valore della progressbar su una percentuale
            'che esprime il numero di righe analizzate
            prgConvert.Value = X * 100 / Image.Width
            'Evita di bloccare il programma. Per ulteriori
            'informazioni su Application e il namespace My,
            'vedere capitolo relativo
            Application.DoEvents()
        Next

        'Reimposta l'immagine finale
        imgPreview.Image = Image
    End Sub
End Class 
<< Precedente Prossimo >>
A proposito dell'autore

C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...