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 :

Création d'une image à partir d'un String.


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut Création d'une image à partir d'un String.
    Bonjour,

    Je souhaite créer une image à partir d'un texte récupéré dans une base de données.

    J'ai trouvé le code suivant qui marche à merveille :

    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
    Sub generationImageVersDisque(ByVal monTexte As String)
     
                ' Instanciation d'un objet Bitmap qui va jouer, en quelque sorte, le rôle de conteneur.
                ' On passe au constructeur les dimensions en pixels que l'on souhaite (largeur, hauteur)
                Dim monBitmap As Bitmap = New Bitmap(600, 100)
                ' Création d'un objet Graphics qui va être notre surface de dessin, on l'associe
                ' à notre objet Bitmap grâce à la méthode FromImage
                Dim monGraphic As Graphics = Graphics.FromImage(monBitmap)
                ' Instanciation de deux objets Brush qui vont nous permettre, respectivement,
                ' de "peindre" le fond, puis de "dessiner" le texte par dessus. Nous leur
                ' passons la couleur que l'on souhaite leur donner
                Dim monPinceau As New SolidBrush(Color.White)
                Dim monStylo As New SolidBrush(Color.Black)
                ' Ici nous nous créons un rectangle de la taille de notre surface de dessin avec
                ' l'objet Brush.
                monGraphic.FillRectangle(monPinceau, 0, 0, 600, 100)
                ' Objet Font qui contient la police et ses caractéristiques
                Dim maPolice As New Font("Arial", 8, FontStyle.Regular)
                ' Structure PointF qui est un ensemble de 2 coordonnées pour le début du texte
                ' sur la surface de dessin.
                Dim mesCoor As New PointF(5.0F, 5.0F)
                ' Rendu du texte : ici nous sommes en qualité optimale.
                ' Plus de détails sur le sujet dans la suite de ce tutoriel
                monGraphic.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit
                ' "Ecriture" du texte sur la surface de dessin, en paramètres, on passe, 
                ' dans l'ordre, le texte, la police, le pinceau, et l'emplacement.
                monGraphic.DrawString(monTexte, maPolice, monStylo, mesCoor)
                ' Enregistrement à la racine de l'application le fichier généré
                monBitmap.Save(Server.MapPath("monImage.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg)
                ' Ce code crée un lien sur votre page pour que vous puissiez vérifier le résultat,
                ' mais il n'est pas nécessaire pour la création de l'image elle-même.
                Response.Write("<a target=""C:\"" href=""monImage.jpg"">Votre image</a>")
     
     
            End Sub
    Néanmoins si le texte est trop long il sort de mon rectangle qui a été défini.

    Je voulais savoir s'il y avait moyen de faire les choses suivantes :
    1. Aller à la ligne lorsque le texte arrive au bout de mon rectangle.
    2. Justifier mon texte


    Tout est géré par la méthode drawstring de la classe graphique mais je n'ai pas trouvé les options que je recherche.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Tu utilises ce prototype.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub DrawString(String, Font, Brush, PointF)
    Pour maîtriser le formatage de l'affichage de ta string, tu pourrais utiliser cette surcharge de DrawString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub DrawString(String, Font, Brush, PointF, StringFormat)
    Qui prend en paramètre un objet StringFormat sur lequel tu définis des flags correspondants à tes contraintes d'affichage.

    A+,
    Agamitsudo.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  3. #3
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Ok ca gère tout ca...

    J'ai rajouté ça à mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Alignment As System.drawing.StringAlignment
                Alignment = StringAlignment.Far
    Par contre je ne sais pas comment faire pour surcharger ma fonction DrawString

    Quand je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monGraphic.DrawString(monTexte, maPolice, monStylo, mesCoor, Alignment)
    Il me met que la surcharge a échoué car aucune fonction Drawstring recevant ces paramètres n'est accessible.

    Sinon autre chose en ce qui concerne le string alignment. Je ne trouve pas l'option "justifier". Les options possibles sont les suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nom de membre Description 
    Center: Spécifie que le texte est aligné au centre du rectangle de mise en page. 
    Far: Spécifie que le texte est aligné loin de la position d'origine du rectangle de mise en page. Dans une mise en page de gauche à droite, la position éloignée est à droite. Dans une mise en page de droite à gauche, la position éloignée est à gauche. 
    Near: Spécifie que le texte doit être aligné près de la mise en page. Dans une mise en page de droite à gauche, la position proche est à gauche. Dans une mise en page de gauche à droite, la position proche est à droite.

    Y a t-il un moyen de justifier mon texte ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Bonjour,

    A ma connaissance, celà n'est pas possible comme tu ne trouveras pas de moyen pour justifier le texte présent dans un button par une simple propriété.

    Ceci dit, une méthode qui aboutirait à une justification du texte n'est pas bien dure à écrire, le but est de définir l'espace moyen entre chaque caractère de ta chaîne.

    Je t'en donne une esquisse sommaire qui prend en compte les polices à largeur variable:
    1) Compter le nombre de caractères à afficher dans la ligne à justifier (incluant les espaces)
    2) Prendre la largeur du texte avant justification (propriété measurestring)
    3) Prendre la largeur du graphique où figure ce texte (propriété width)
    4) Calculer l'espace manquant (3 - 2)
    5) Calculer l'espace à ajouter par caractère (4 / 1)
    6) Ecrire chaque caractère en prenant son indice dans la chaine, en calculant la largeur de la chaine jusqu'à ce caractère et en ajoutant 5 multiplié par la valeur de l'indice

    Je sais pas si j'ai été assez clair là...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Ma solution précédente est basée sur un "étirement" de la position de chaque caractère, une autre méthode consisterait à appliquer le même algorithme mais en groupant les espacements par mot et non pas par caractère...

    C'est l'option de Microcro World me semble t'il...

  6. #6
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Oulala Oulala ...

    Merci beaucoup pour ces informations.

    Tu es pas mal clair dans tes explications... Mais comme je ne suis pas un très grand codeur ... C'est la mise en pratique qui va me poser quelques soucis je pense.

    Bon je vais me lancer pas à pas la dedans...

    Je te dis à dans pas longtemps pour mon prochain pb

    Merci encore.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Ok alors pour le moment ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Recherche du nb de caractères dans la chaîne de caractère
                Dim NbCarac As Integer = Len(dsModule.Tables("Info").Rows(0)(2).ToString())
                'Recherche du nombre de lignes en Double
                Dim NbLigne As Double = NbCarac / 90
                'Recherche du nombre de lignes en Integer --> On ajoute une ligne
                Dim NbLigneInt As Integer
                NbLigneInt = CType(NbLigne, Integer) + 1
                Me.Message.Text = NbLigneInt.ToString
    Mais comment je vais faire pour lui dire d'aller à ligne au bout de tant de caractères ? ou de tant de pixels ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Points : 254
    Points
    254
    Par défaut
    Si tu veux etirer ton texte dans tous les sens et controler sa taille de facon précise, il ne faut pas utiliser DrawString mais plutot passer par un GraphicsPath.

    J'avais posté a ce sujet il y a quelques temps.
    En utilisant un graphicsPath, tu peux programmer une classe qui réagira un peu comme un objet WordArt ...

    http://www.developpez.net/forums/sho...84#post3319484

  9. #9
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    J'ai un peu regardé cette classe qui a l'air bien puissante mais en ce qui concerne les stringalignment disponibles c'est idem ==> Pas d'option "justify" !

  10. #10
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Peut-on exporter un graphique en jpeg ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim maPolice As New Font("Arial", 8, FontStyle.Regular)
                Dim myRect As RectangleF
                Dim g As New System.Drawing.Drawing2D.GraphicsPath
                Dim graph As System.Drawing.Graphics
                Dim pen As Pen
                Dim image As System.Drawing.Image
     
                g.AddString(dsModule.Tables("Info").Rows(0)(2).ToString(), maPolice.FontFamily, maPolice.Style, maPolice.Size, New Point(10, 20), StringFormat.GenericDefault)
     
                graph.DrawPath(Pens.Black, g)
    Quel serait le code à rajouter ?

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Points : 254
    Points
    254
    Par défaut
    Pour la justification de ton texte :
    Perso, je gère tout à la mimine.
    Je rajoute une chaine au GraphicsPath (Taille de la police, Point de départ, StringFormat : on s'en fout, le tout sera déformé et replacé comme on souhaite à l'aide des matrices)
    Je récupère grace à la méthode GetBound, le rectangle qui circonscrit exactement la chaine.
    Grace à la taille et aux coordonnées de ce rectangle, j'étire le GraphicsPath en long et en large pour obtenir la taille voulue et je replace le tout à l'endroit voulu.

    Pour la sauvegarde :
    MonBitmap.Save(MonNomDeFichier, System.Drawing.Imaging.ImageFormat.Jpeg )

  12. #12
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Ok

    Je te remercie Totanne. Je vais me lancer la dedans.

    Aurais-tu des exemples de code ?

    Tiens moi au courant.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Points : 254
    Points
    254
    Par défaut
    Dans ta Form, dessine un bouton et un PictureBox et place ce code.
    - Premier clic : Ton texte à la taille voulue.
    - Deuxième clic : Un autre example de déformation.
    Bon courage ...

    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
    Imports System.Drawing.Drawing2D
     
    Public Class Form1
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            'Taille et emplacement voulu pour la chaine
            Dim RectFinal As RectangleF = New RectangleF(0, 0, 100, 200)
     
            'Creation du chemin graphique
            Dim GP As New GraphicsPath
            GP.AddString("Test", New FontFamily("Arial Black"), FontStyle.Regular, 1, New PointF, New StringFormat)
     
            'Modifications
            Dim RectDepart As RectangleF = GP.GetBounds
            Dim Mx As New Matrix
            Mx.Translate(RectFinal.X - RectDepart.X, RectFinal.Y - RectDepart.Y)
            GP.Transform(Mx)
            Mx.Reset()
            Mx.Scale(RectFinal.Width / RectDepart.Width, RectFinal.Height / RectDepart.Height)
            GP.Transform(Mx)
     
     
            'Gestion du deuxième clic
            Static DeuxiemeClic As Boolean = False
            If DeuxiemeClic Then
                Mx.Reset()
                Mx.Shear(0, 0.5)
                GP.Transform(Mx)
            End If
     
            'Passage à la PictureBox
            Dim B As New Bitmap(PictureBox1.Width, PictureBox1.Height)
            Dim G As Graphics = Graphics.FromImage(B)
            G.SmoothingMode = SmoothingMode.HighQuality
            G.FillPath(Brushes.Black, GP)
     
            'Dessin du rectangle pour vérification
            If Not DeuxiemeClic Then G.DrawRectangle(Pens.Red, Rectangle.Round(RectFinal))
     
            PictureBox1.Image = B
            DeuxiemeClic = True
     
        End Sub
    End Class

  14. #14
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Ahhhh ...

    Je suis en Webform ... Y a t'il un équivalent au "picturebox" ? Sinon c'est pas grave. Mon but est une fois mon "graph" créé avec mon texte, de le convertir en jpeg... Peu importe si je ne le vois pas à l'écran.

    Merci beaucoup pour le code en tout cas...

    Je comprends déjà bien mieux !!!

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Points : 254
    Points
    254
    Par défaut
    La PictureBox n'est là que pour recevoir l'image ... n'importe quel controle ayant une propriété image peut faire l'affaire.

  16. #16
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Perfect ... Au boulot alors

  17. #17
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Ok ca commence à venir mais il y a des choses qui me manquent.

    Comment faire pour passer à la ligne car mon texte sort de mon image.
    C'est la matrice qui gère ?

    Sinon le fond de mon image est noire et les caractères ne sont pas standards : le contour de chaque caractère est blanc et l'intérieur est noir.

    Je mets une image en pièce jointe pour s'imaginer.

    Je recherche à avoir un fond blanc ainsi qu'une police Arial normale.
    Images attachées Images attachées  

  18. #18
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 55
    Points
    55
    Par défaut
    Une autre image avec une police plus grande
    Images attachées Images attachées  

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Points : 254
    Points
    254
    Par défaut
    Pour ton histoire de fond blanc ou noir :
    - DrawPath te dessine le contour à la couleur voulue
    - FillPath te rempli le fond à la couleur voulue

    Pour le reste, je vois pas trop ce que tu veux faire ...
    A partir de DrawString et GraphicsPath tu as de toute facon tous les éléments en main pour contraindre ton texte.

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

Discussions similaires

  1. Création d'une image à partir d'une fenêtre
    Par bbkenny dans le forum VBScript
    Réponses: 10
    Dernier message: 27/03/2011, 04h11
  2. Réponses: 0
    Dernier message: 16/03/2011, 16h18
  3. [FPDF] Création d'une image à partir d'un pdf
    Par Tchupacabra dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 04/04/2008, 21h36
  4. Création d'une image à partir de son code binaire
    Par thefaycal dans le forum ASP
    Réponses: 11
    Dernier message: 18/05/2006, 17h39
  5. Réponses: 1
    Dernier message: 03/01/2006, 17h46

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