Creare nuvola di punti da Font di WIN

lunedì 16 febbraio 2009 - 11.29

willy_80 Profilo | Senior Member

Ciao a tutti,
Sto creando un programma in vb2008 che rielabora le nuvole di punti.
Vorrei aggiungere una funzione che mi consenta di creare delle nuvole di punti partendo dai font.
L'idea che ho avuto io era questa:
1. Scrivo in una textbox la frase che voglio
2. Catturo il monitor e salvo l'immagine in una bmp
3. Elaboro tutti i pxl dell'immagine e al bianco assegno il valore minimo e al nero il valore max
4. Risultato molto scadente vista la risoluzione dell'imm,agine ottenuta.

Mi sapete indicare come poter convertire le lettere in un immagine con buona risoluzione? poi me le scalo io alla misura che voglio.
Grazie.

aiedail92 Profilo | Expert

Ciao

Non ho capito bene la faccenda della nuvola di punti, comunque puoi disegnare del testo su un'immagine usando il metodo DrawString della classe Graphics.

Ad esempio:

'Crea la font "Microsoft Sans Serif", 72 punti Dim font As New Font("Microsoft Sans Serif", 72, GraphicsUnit.Point) 'Crea un'immagine 1 x 1 per avere un graphics per la misura della stringa Dim bmp As New Bitmap(1, 1) 'La dimensione dell'immagine necessaria a contenere il testo Dim size As Size 'Il testo da scrivere sull'immagine Dim text As String = "DotNetHell" 'Crea il graphics per ottenere le dimensioni per la scrittura Using g As Graphics = Graphics.FromImage(bmp) 'Imposta l'anti-alias per il rendering del testo g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias 'Esegue la misurazione della stringa size = g.MeasureString(text, font, PointF.Empty, StringFormat.GenericDefault).ToSize() End Using 'Crea la bitmap della dimensione necessaria bmp = New Bitmap(size.Width, size.Height) 'Ottiene il Graphics per disegnare sulla bitmap Using g As Graphics = Graphics.FromImage(bmp) 'Imposta l'anti-alias per il rendering del testo g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias 'Disegna la scritta sull'immagine g.DrawString(text, font, Brushes.Black, 0, 0) End Using 'Salva l'immagine su un file bmp.Save("C:\img.png", Imaging.ImageFormat.Png)

Luca

willy_80 Profilo | Senior Member

Ho provato il tuo sistema e non è male però ho provato a salvare in formato bmp e mi da una bmp tutta nera, ho provato a salvare in png, caricarla in una picturebox e risalvarla in bmp ed ottengo ancora una bmp tutta nera come posso fare?

aiedail92 Profilo | Expert

Ti basta aggiungere una chiamata al metodo Graphics.Clear subito prima di disegnare il testo:

'Crea la font "Microsoft Sans Serif", 72 punti Dim font As New Font("Microsoft Sans Serif", 72, GraphicsUnit.Point) 'Crea un'immagine 1 x 1 per avere un graphics per la misura della stringa Dim bmp As New Bitmap(1, 1) 'La dimensione dell'immagine necessaria a contenere il testo Dim size As Size 'Il testo da scrivere sull'immagine Dim text As String = "DotNetHell" 'Crea il graphics per ottenere le dimensioni per la scrittura Using g As Graphics = Graphics.FromImage(bmp) 'Imposta l'anti-alias per il rendering del testo g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias 'Esegue la misurazione della stringa size = g.MeasureString(text, font, PointF.Empty, StringFormat.GenericDefault).ToSize() End Using 'Crea la bitmap della dimensione necessaria bmp = New Bitmap(size.Width, size.Height) 'Ottiene il Graphics per disegnare sulla bitmap Using g As Graphics = Graphics.FromImage(bmp) 'Imposta lo sfondo bianco g.Clear(Color.White) 'Imposta l'anti-alias per il rendering del testo g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias 'Disegna la scritta sull'immagine g.DrawString(text, font, Brushes.Black, 0, 0) End Using 'Salva l'immagine su un file bmp.Save("C:\img.bmp", Imaging.ImageFormat.Bmp)

Luca

willy_80 Profilo | Senior Member

Ok ora mi funziona tutto.
Un ultima domanda....
Il codice che mi hai gentilmente dato mi permette di creare una stringa, misurarne le dimensioni, e scriverla in una immagine ridimensionata correttamente.
E' possibile fare tutto ciò scrivendo su due righe Es:

DotNet
Hell

Ciao e grazie

Jeremy Profilo | Guru

Ciao willy.

Se usi un pò di fantasia su questa riga di codice
>bmp = New Bitmap(CInt(size.Width), CInt(size.Height))
e su questa riga di codice
>g.DrawString(text, font, Brushes.Black, 0, 0)
puoi farlo, ovviamente creando due variabili string diverse che conterranno "Dotnet" e "Hell".

Facci sapere...
Ciao

aiedail92 Profilo | Expert

Se sai già dove devi andare a capo, basta che metti un CR-LF nella stringa, ad esempio:

text = "DotNet" & vbCrLf & "Hell"

Senza fare troppo casino lavorando con diverse stringhe.

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5