IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB 2010] Créer une image contenant du texte


Sujet :

VB.NET

  1. #1
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 233
    Points : 72
    Points
    72
    Par défaut [VB 2010] Créer une image contenant du texte
    Bonjour à tous,
    Je souhaite créer un fichier image (JPG si possible, sinon BMP si c'est plus simple) à des dimensions définies, qui ne contiendrait que du texte (définit par l'utilisateur). Ce texte serait gris sur fond blanc.
    Idéalement le texte serait centré et en diagonale dans le fichier image.

    Mais je sèche rien qu'en voulant créer une image contenant du texte.
    Voila mon petit code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As PaintEventArgs) Handles Button3.Click
            Dim drawString As String
            Dim drawFont As New Font("Arial", 16)
            Dim drawBrush As New SolidBrush(Color.Black)
            Dim x As Single = 150
            Dim y As Single = 50
     
            Dim drawFormat As New StringFormat
            drawString = TextBox1.Text
            drawFormat.FormatFlags = StringFormatFlags.DirectionVertical
     
     
            e.Graphics.DrawString(drawString, drawFont, drawBrush, x, y, drawFormat)
        End Sub
    Lorsque je clique sur bon bouton, j'ai un message avec l'erreur suivante :
    Impossible d'effectuer un cast d'un objet de type 'System.Windows.Forms.MouseEventArgs' en type 'System.Windows.Forms.PaintEventArgs'.

    Je crois qu'il y a une incompatibilité entre le fait que je clic sur un bouton et le fait que je souhaite travailler en mode graphique ...
    Malgré mes recherches je ne parviens pas à solutionner ce problème.
    Quelqu'un aurait une piste ?

    Merci d'avance pour vos réponses

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Cela me semble similaire à mettre une légende directement sur une photo.

    Désolé, mais je te laisse l'évaluation et tout le reste.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    visiblement tu es parti d'un code qui permet d'afficher du texte sur un control, via l'event paint qui a un argument e de type painteventargs, qui lui même contient une variable de type graphics
    mais transformer un event click en paint ce n'est pas possible, e sur l'event click n'est pas de type painteventargs (d'ailleurs tu dois avoir un problème de conf si tu arrives à compiler ce code d'ailleurs)

    bref il te faut créer une image, puis faire le texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using b as new system.Drawing.bitmap (widthpix, heightpix)
      using g = system.Drawing.graphics.fromimage(b) ' lie ce graphics à l'image, tout ce qui est fait sur le graphics est fait sur l'image
        g.clear(colors.white)
        g.drawstring(texte, ..., un rectangle 0,0,width,height, le string format qui centre ...)
        b.save(filepath,imaging.imageformat.jpg)
      end using
    end using
    si tu ne veux pas sauvegarder l'image sur le disque mais la garder en ram, il faut supprimer le .save et le using devant b (end using "détruit" la variable)
    tu peux aussi récupérer les octets du jpg seulement si c'est nécessaire (pour envoi ou autre)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Comme dit par Pol63 il faut dessiner avec le Graphics obtenu à partir d'un bitmap que tu dois créer ...
    La grande complication vient du fait qu'il faut mesurer le Size du texte (un string) avec le Font souhaité ..
    La fonction Graphics.MeasureString dispose de plusieurs surcharge :
    -Graphics.MeasureString(string,font) mesure le string avec sa taille "reelle" qui tient compte uniquement du size du Font (avec StringFormat.NoWrap => pas de retour à la ligne)
    -Graphics.MeasureString(string,font,SizeF) mesure le string avec une taille "imposée" SizeF mais alors si la taille "réelle" du string dépasse la taille imposée...à cause du size du Font trop grand ,le string sera dessinée tronqué...

    Le code exemple ajuste le size définitif du Bitmap après "mesure" du string de manière que quel soit l'angle de rotation il "tient dans le bitmap ..
    Apres Bmp.Save avec un format d'image souhaité permet de l'enregistrer ...

    - dropper un Button,un Picbox,un Textbox et un NumericUpDown pour faire varier l'angle pour illustration

    code .vb exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
     
     
    Imports System.Drawing.Drawing2D
     
    Public Class Form1
        Private angle As Single
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Pic.Size = New Size(300, 250)
            Pic.SizeMode = PictureBoxSizeMode.StretchImage
            NumericUpDown1.Maximum = 360
            NumericUpDown1.Minimum = -360
            NumericUpDown1.Value = 0
            angle = 0
     
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            DrawStringRotated()
     
        End Sub
        Private Sub DrawStringRotated()
            If String.IsNullOrEmpty(TextBox1.Text) Then Return
            Dim drawString As String = TextBox1.Text
            Dim drawFont As New Font("Arial", 72, FontStyle.Bold)
            Dim drawBrush As New SolidBrush(Color.LightSlateGray)
            Dim sizeString As SizeF = GetSizeString(drawString, drawFont)
     
            Dim drawFormat As New StringFormat
            Dim textArea As Rectangle 'rectangle englobant de la taille reelle
            'le bitmap convoité assez grand pour contenir le texte 
            'meme quand il tourne
            Dim w As Integer = Math.Max(sizeString.Width, sizeString.Height)
            Dim bmp As New Bitmap(w, w)
     
     
            Using gr As Graphics = Graphics.FromImage(bmp)
     
                gr.ResetTransform()
                gr.Clear(Color.White)
                gr.SmoothingMode = SmoothingMode.HighQuality
                drawFormat.FormatFlags = StringFormatFlags.NoWrap 'pas de retour à la ligne
     
     
                textArea = New Rectangle(0, 0, sizeString.Width, sizeString.Height)
     
                'on decale l'origine du rectangle englobant car l'origine des coordonnees sera translaté 
                textArea.Offset(-CInt(sizeString.Width / 2), -CInt(sizeString.Height / 2))
     
                gr.TranslateTransform(sizeString.Width / 2, bmp.Height / 2)
                gr.RotateTransform(angle)
     
     
                gr.DrawString(drawString, drawFont, drawBrush, textArea, drawFormat)
                gr.DrawRectangle(Pens.Red, textArea)
     
                drawFont.Dispose()
                drawBrush.Dispose()
     
     
            End Using
     
     
     
     
            Pic.Image = bmp
     
        End Sub
     
        Private Function GetSizeString(ByVal s As String, ByVal fnt As Font) As SizeF
            Dim sz As SizeF
            Dim bm As Bitmap = New Bitmap(2, 2) 'peu importe le bitmpa,l'essentiel est d'avoir un objet graphics
            Using gr As Graphics = Graphics.FromImage(bm)
                sz = gr.MeasureString(s, fnt) 'taille reelle
            End Using
            Return sz
        End Function
     
        Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
            angle = NumericUpDown1.Value
            DrawStringRotated()
        End Sub
     
     
     
    End Class
    bon code...

  5. #5
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 233
    Points : 72
    Points
    72
    Par défaut
    Bonjour, et merci beaucoup pour vos réponses !
    Voici le code que j'ai pu bricoler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles Button3.Click
     
            PictureBox1.Width = 500
            PictureBox1.Height = 150
            PictureBox1.BackColor = Color.White
     
            Dim bmp As Bitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
     
            Dim g As Graphics = Me.CreateGraphics()
            g = Graphics.FromImage(bmp)
     
            Dim nom As String
            Dim nom1 As String = "Etude n°"
            nom1 = UCase(nom1)
            nom = UCase(TextBox1.Text)
     
            Dim longueur As Integer = Len(nom)
            If Len(nom1) > Len(nom) Then
                longueur = Len(nom1)
            End If
     
            Dim Taille As Integer = (Math.Round(PictureBox1.Width / longueur)) - 1
     
            Dim x1 As Integer = PictureBox1.Width / 2 - ((Len(nom1) / 2) * Taille) + Taille
            Dim x As Integer = PictureBox1.Width / 2 - ((Len(nom) / 2) * Taille) + Taille
     
            Dim drawFont As Font = New Font("Arial", Taille)
            g.DrawString(nom1, drawFont, Brushes.DarkGray, x1, PictureBox1.Height / 2 - Taille)
            g.DrawString(nom, drawFont, Brushes.DarkGray, x, PictureBox1.Height / 2 + 0.5 * Taille)
            g.RotateTransform(55)
     
            PictureBox1.Image = bmp
     
        End Sub
    Tout fonctionne comme je veux, à part la rotation à 55°, je ne parviens pas à comprendre ce qui bloque...
    Quelqu'un aurait une idée ?

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut

    Tout fonctionne comme je veux, à part la rotation à 55°, je ne parviens pas à comprendre ce qui bloque...
    Quelqu'un aurait une idée ?
    Ca bloque chez toi ,parce que tu ne cherche pas à étudier le code déjà donné et que tu reposte le mémé code qu'avant !!!
    Tu ne vois ton texte avec un angle de 55 parce tu utilises sauvagement les transformations de GDI+ avec du copier-coller...
    1/ RotateTransform
    - fait tourner le dessin autour de- l'Origine des Coords par Défaut(haut parleur,en haut et à gauche)- c.à.d le point (0,0) de l'objet sur lequel on dessine -ici le Bitmap..
    2/RotateAtt avec un Matrix
    -Si on veut faire tourner tourner le dessin sur lui-même (c.à.d sur son propre centre PointCentre),il faut utiliser un Matrix.RotateAt(angle,PointCentre) et l'assigner à Graphics.Transform...
    le code suivant est un exemple "animé" avec le NumericUpDown pour comprendre ce qui se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Imports System.Drawing.Drawing2D
     
    Public Class Form3
        Private angle As Single = 0.0
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            PictureBox1.Size = New Size(300, 500)
            NumericUpDown1.Value = 0
            NumericUpDown1.Maximum = 360
            NumericUpDown1.Minimum = -360
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            DrawString()
        End Sub
        Private Sub DrawString()
     
            Dim s As String = "blablah ..."
            Dim rect As New Rectangle(100, 150, 120, 90)
            Dim bmp As Bitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
            Using gr As Graphics = Graphics.FromImage(bmp)
                gr.Clear(Color.BlanchedAlmond)
                gr.ResetTransform() 'RAZ du transform
                gr.RotateTransform(angle)
                gr.DrawRectangle(Pens.Red, rect)
                gr.DrawString(s, PictureBox1.Font, Brushes.Brown, rect.Location)
     
                gr.ResetTransform() 'RAZ du transform
                Dim centerRect As New Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2)
                Dim m As New Matrix
                m.RotateAt(angle, centerRect)
                gr.Transform = m
                gr.DrawRectangle(Pens.Black, rect)
                gr.DrawString(s, PictureBox1.Font, Brushes.Blue, rect.Location)
            End Using
            PictureBox1.Image = bmp
        End Sub
        Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
            angle = NumericUpDown1.Value
            DrawString()
        End Sub
     
     
    End Class
    bon code !!!

  7. #7
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 233
    Points : 72
    Points
    72
    Par défaut
    Impeccable !
    Merci pour ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GD] Comment créer une image à partir d'un texte ?
    Par Alexandrebox dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 11/02/2008, 04h33
  2. créer sur une image du texte déplaçable
    Par blumb dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/05/2007, 16h42
  3. [CR7] mettre une image ou texte de fond
    Par yoyothebest dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 11/08/2006, 14h40
  4. [Image]Créer une image avec JAVA 1.1
    Par burno dans le forum 2D
    Réponses: 4
    Dernier message: 11/08/2004, 09h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo