Condividi tramite


VB.NET Estrarre Immagini da un File RTF (it-IT)

Nell’esempio seguente, viene mostrato un modo per eseguire il parsing di un file RTF, andando ad estrarne le immagini contenute, e creando uno stream visualizzabile all’interno di un controllo di tipo PictureBox. I dettagli del funzionamento vengono riportati nei commenti a corredo.

Imports System.IO
Imports System.Text

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Acquisiamo il testo di un ipotetico file RTF come stringa
        ' Il file deve contenere una o più immagini, ed eventualmente altri elementi a piacere
        Dim rtfString As String = File.ReadAllText("c:\tmp\doc.rtf")

        ' Verifichiamo il numero di occorrenze del tag PICT, ovvero il numero di immagini
        ' presenti nel file
        Dim occorrenze() As Integer = PosOccorrenzeImmagini(rtfString)

        ' Visualizziamo una tra le immagini (nell'esempio la numero 0, ovvero la prima),
        ' presentandola in un ipotetico PictureBox di nome PictureBox1
        EstraiImmagine(rtfString, occorrenze(0), PictureBox1)
    End Sub

    ' ==========================================================================
    ' Funzione PosOccorrenzeImmagini
    ' Dato il testo RTF di un file, esegue il parsing dello stesso alla ricerca
    ' di tag PICT, restituendo un array di posizioni di tali tag all'interno del
    ' ==========================================================================

    Public Function PosOccorrenzeImmagini(rtfString As String) As Integer()
        Dim _tIdx As New List(Of Integer)
        Dim _tStr As String = rtfString
        While _tStr.Length > 0
            Dim _tPos As Integer = _tStr.IndexOf("{\pict\)
            If _tPos = -1 Then Exit While
            _tIdx.Add(_tPos)
            _tStr = _tStr.Substring(_tPos + 1)
        End While
        Return _tIdx.ToArray
    End Function

    ' ==========================================================================
    ' Funzione EstraiImmagine
    ' Dato il testo RTF di un file, il numero ordinale dell'immagine da reperire
    ' ed il controllo PictureBox su cui visualizzare l'immagine, estrae dal testo
    ' i dati dell'immagine, e ne effettua la rappresentazione grafica
    ' ==========================================================================

    Public Sub EstraiImmagine(rtfString As String, posImage As Integer, pBox As PictureBox)
        Dim pictTagIdx As Integer = posImage
        Dim startIndex As Integer = rtfString.IndexOf(" ", pictTagIdx) + 1
        Dim endIndex As Integer = rtfString.IndexOf("}", startIndex)

        Dim buffer() As Byte = ConvertiBuffer(rtfString.Substring(startIndex, endIndex - startIndex))
        Dim mStream As New MemoryStream(buffer)
        pBox.Image = Image.FromStream(mStream)
        mStream.Dispose()
    End Sub

    ' ============================================================================
    ' Funzione ConvertiBuffer
    ' Utilizzata da EstraiImmagine(): a fronte della lettura di una serie di bytes
    ' in formato esadecimale, questa funzione ne esegue la conversione verso un
    ' formato fruibile da un MemoryStream, ovvero un array di bytes
    ' ============================================================================

    Public Function ConvertiBuffer(datiHex As String) As Byte()
        If (datiHex.CompareTo(String.Empty) = 0) Then
            Return Nothing
        End If

        Dim numHex As Integer = datiHex.Length
        Dim _size As Integer = numHex / 2
        Dim _bit(_size) As Byte
        Dim hex As New StringBuilder
        Dim pos As Integer = 0

        For i As Integer = 0 To numHex - 1
            Dim c As Char = datiHex(i)
            If Char.IsWhiteSpace(c) Then Continue For
            hex.Append(c)
            If hex.Length = 2 Then
                _bit(pos) = Byte.Parse(hex.ToString(), System.Globalization.NumberStyles.HexNumber)
                pos += 1
                hex.Remove(0, 2)
            End If
        Next
        Return _bit
    End Function

End Class