Ritaglio immagine su base testuale.

di il
2 risposte

Ritaglio immagine su base testuale.

Buonasera,

vorrei trasformare una stringa di testo in caratteri provenienti da un'immagine (come se fosse un font custom) ma il risultato non è quello voluto poiché nell'immagine risultante viene sempre copiata una sezione di font corrispondente al numero di caratteri della stringa di input.

Per esempio, se voglio convertire la parola: 'ciao' il programma restituisce '0123' e così via procedendo per le lettere in ordine alfabetico fino ad arrivare, eventualmente, ai simboli.

[CODE] Dim LCF As Bitmap = My.Resources.LiquidCristalFont ' Una bitmap 550x11 che contiene i disegni delle lettere e dei numeri nella sequenza indicata nella funzione seguente assegnata alla stringa 'Font'. Function TransformToFont(ByVal Text As String) As Bitmap Dim _Text As String = Text.Trim.ToUpper Dim Font As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ !?\/.,:;[]()'""""%=+-*^™#_$" Dim Width As Integer = 9 ' La larghezza della finestra che preleva la sezione d'immagine LCF (la larghezza di ogni lettera) Dim Height As Integer = 11 ' L'altezza dell'imagine LCF Dim bmp As New Bitmap(_Text.Length * Width, Height) Dim gr As Graphics = Graphics.FromImage(bmp) gr.Clear(Color.Transparent) For x As Integer = 0 To _Text.Length - 1 Dim _Char As String = _Text.Substring(x, 1) If Font.Contains(_Char) Then Dim Index As Integer = Font.IndexOf(_Char) * Width ' * Calcolo l'offset per posizionare la finestra di copia su LCF moltiplicando l'indice per del carattere per la larghezza della finestra di copia (praticamente lo step). gr.DrawImage(Crop(LCF, Index, 0, Width, Height), New Point(Index, 0)) ' Disegno la sezione d'immagine nella bitmap di destinazione Else gr.DrawImage(Crop(LCF, 324, 0, Width, Height), New Point(324, 0)) ' Lascio uno spazio End If Next Return bmp End Function Public Function Crop(ByRef Image As Bitmap, XOffset As Integer, YOffset As Integer, ByVal Width As Integer, ByVal Height As Integer) As Bitmap Try Dim bmp As New Bitmap(Width, Height) Dim gr As Graphics = Graphics.FromImage(bmp) gr.DrawImage(Image, 0, 0, New Rectangle(XOffset, YOffset, Width, Height), GraphicsUnit.Pixel) Return bmp Catch ex As Exception Return Image End Try End Function Grazie a chi vorrà aiutarmi.

2 Risposte

  • Re: Ritaglio immagine su base testuale.

    Stai continuando a sovrascrivere l'immagine completa, invece di disegnare tanti rettangoli 9x11 quanti sono i caratteri della parola passata come argomento.

    Devi ritagliare solo il rettangolo che ti interessa, relativo al carattere di cui calcoli l'indice con Font.IndexOf e disegnarlo affiancato ai precedenti. Devi tenere conto quindi dello spostamento verso destra, incrementandolo di 9 ad ogni carattere che trovi. Se il carattere non lo trovi, ti sposti di 9 a destra e basta.

    P.S. Font è un brutto nome per una variabile, essendo anche quello di una classe...
  • Re: Ritaglio immagine su base testuale.

    Buonasera Sgrubak e grazie per la risposta.

    Si, 'Font' è un nome brutto ma di facile identificazione per mostrarlo al forum. Il nome della variabile è un altro.

    Nel ciclo For io scrivo:
    [CODE] Dim Index As Integer = Font.IndexOf(_Char) * Width proprio con l'intenzione di spostare l'offset sull'asse X all'interno dell'immagine sorgente poiché i caratteri contenuti in 'Font' hanno le rispettive posizioni all'interno dell'immagine.

    Posso verificare la bonta dei risultati ottenuti all'interno di una MsgBox dopo aver popolato una stringa durante il ciclo contenente:
    [CODE] _Char & " " & Index/9 & " " & Index che rappresentano rispettivamente il carattere corrente, l'indice dello stesso all'interno della stringa 'Font', l'Offset da applicare sull'asse X per ottenere lo spostamento dell'immagine e tutti i valori ottenuti sono giusti per cui non credo l'errore sia qui.

    Inoltre in:
    [CODE] gr.DrawImage(Crop(LCF, Index, 0, Width, Height), New Point(Index, 0)) Eseguo il crop dell'immagine definendo il rettangolo sorgente (immagine, offsetX, offsetY, 9, 11) e il punto di destinazione nell'immagine di destinazione New Point(Index, 0).

    E scrivendo quest'ultimo passo mi sono reso conto dell'errore che risiede nella definizione New Point(Index, 0) che in realtà prevederebbe di tenere traccia, dello spostamento da effettuare sull'immagine target (ossia New Point(x * 9, 0) e questo ha risolto il problema.

    Grazie mille per la collaborazione.
Devi accedere o registrarti per scrivere nel forum
2 risposte