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