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 :

Inserer string (texte) sur une image via l'affichage d'un label


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut Inserer string (texte) sur une image via l'affichage d'un label
    Bonjour,

    J'ai cree un Label qu'on peut bouger sur une Image (Image dans un PictureBox).
    Je peux changer le font du text contenu dans le Label via un bouton.
    Maintenant, je voudrais ecrire le contenu de mon Label sur l'Image: le texte sur l'image devra etre de la meme taille que le text de mon Label et au meme endroit.

    C'est la que j'ai un probleme: comment transferer la taille affichee du label sur mon image?
    Le code ci-dessous montre en partie ce que j'ai fais (mais c'est un peu brouillon et en plus il y a layout.Y au lieu du layout.X pour avoir la position correcte, autre petit probleme a resoudre quand j'aurais les yeux en face des trous).

    En esperant avoir ete compris. Merci.
    JLuc01

    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
     
                Dim cloneBitmap As Bitmap = Nothing
                Dim fs As New System.IO.FileStream(myPath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
                'Dim img2 As Image = Image.FromStream(fs)
                Dim img2 As Bitmap = CType(Bitmap.FromStream(fs), Bitmap)
                pbCheckImage01.BackgroundImage = img2
                Using g As Graphics = Graphics.FromImage(img2)
                    ' Text position of Label TGlass
                    Dim topleft As Point
                    topleft = New Point(TGlass.Top, TGlass.Left)
                    ' Text content of Label TGlass
                    Dim strCalendar As String = TGlass.Text
                    ' Measurement of the label TGlass (strCalendar) for a selected font
                    Dim sizeString As New SizeF
                    sizeString = g.MeasureString(strCalendar, TGlass.Font)
                    ' Rectangle layout for the selected font
                    Dim layout As New Rectangle(topleft, Size.Ceiling(sizeString))
                    'If layout.Right < 400 - (layout.Right - layout.X) Then
                    layout.X = CInt(layout.X * (img2.Height / pbCheckImage01.Height))
                    'End If
                    'If layout.Bottom < 400 - (layout.Bottom - layout.Y) Then
                    layout.Y = CInt(layout.Y * (img2.Width / pbCheckImage01.Width))
                    'End If
                    ' Text First Page
     
                    Dim myFont As New Font(TGlass.Font.FontFamily, CInt(TGlass.Font.Size * (img2.Width / img2.Height)), TGlass.Font.Style)
     
                    'Dim myFont As New Font(TGlass.Font.FontFamily, sizeString.ToSize, TGlass.Font.Style)
                    Dim myBrush As New SolidBrush(TGlass.ForeColor)
                    'g.DrawString(strCalendar, TGlass.Font, Brushes.Red, layout)
                    g.DrawString(strCalendar, myFont, myBrush, layout.Y, layout.X) 'layout.Width, layout.Height)
     
                    ' Remove the TextWindow class
                    pbCheckImage01.Controls.Remove(TGlass)
                    Refresh()
                    cloneBitmap = img2
                End Using

  2. #2
    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

    ControlInstance.DrawToBitmap(bmp, targetbounds) est ton ami.
    Que fait-il ? il prend une "capture" du control et la restitue sur le bmp specifie ,dans le rectangle spécifie .
    Ton problème se situera dans le type de restitution de l'image que tu veux avoir y compris ton texte du Label :
    - image à sa taille réelle( ImageLayout.None), ajusté a taille du picturebox( ImageLayout.Stretch), agrandie ( ImageLayout.Zoom), centrée( ImageLayout.Center), mosaique (ImageLayout.Tile)

    code behind.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
     
    Imports System.IO
     
    Public Class Form1
        'NOTA BENE : les 2 pictureboxes d'exemple ont meme taille
        Private lbl As Label = Nothing
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            'ajout label (fin d'illustration)
            lbl = New Label
            lbl.AutoSize = True
            lbl.BorderStyle = BorderStyle.FixedSingle
            lbl.Location = New Point(226, 142)
            lbl.Font = New Font("Arial", 16.0F, FontStyle.Bold)
            lbl.Name = "Label1"
            lbl.Size = New Size(60, 15)
            lbl.Text = "Mon Label"
            PictureBox1.Controls.Add(lbl)
     
            PictureBox1.BackgroundImageLayout = ImageLayout.Stretch 'taille du bitmap = celle du picbox
            Dim bmp As Bitmap = New Bitmap(My.Resources.Mebarek, PictureBox1.Size) 'resize le bmp pour l'adapter à taille du bitmap
            PictureBox1.BackgroundImage = bmp
            PictureBox2.BackgroundImageLayout = ImageLayout.Stretch
     
            'AUTRE  VERSION
            'PictureBox1.BackgroundImageLayout = ImageLayout.None 'la taille du picbox = taille du bitmap 
            'Dim bmp As Bitmap = New Bitmap(My.Resources.Mebarek) 'pas de resize du bmp 
            'PictureBox1.BackgroundImage = bmp
            'PictureBox2.BackgroundImageLayout = ImageLayout.None
     
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
     
            Dim bmp As Bitmap = PictureBox1.BackgroundImage
     
            PictureBox1.DrawToBitmap(bmp, PictureBox1.ClientRectangle)
     
            PictureBox2.BackgroundImage = bmp
        End Sub
     
     
    End Class
    NOTA BENE : les 2 pictureboxes d'exemple ont même taille

    bon code...

  3. #3
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Excellent!
    Cela m'a pris un peu de temps a l'adapter a mes besoins, mais maintenant ca marche impeccable.
    Et c'est certainement plus simple que mon g.MeasureString avec lequel j'etais parvenu presque a ce que je voulais.

    Merci Mabrouki.
    JLuc01

  4. #4
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    En fait, j'ai note un petit probleme avec cette nouvelle facon de faire.
    C'est simple, je perds en pixel: mon image de depart etait 6000x4000px et maintenant elle est de 400x266px (taille de ma PictureBox).

    Y-a-t-il un moyen de resoudre ce probleme avec DrawToBitmap method ou dois-je revenir avec mon g.MeasureString?

    Merci,
    JLuc01

  5. #5
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Salut!

    Finalement, je suis arrive a faire quelquechose qui marche presque parfaitement, mais je ne comprends pas une partie de mon code (plus exactement le nombre 3.16).

    1- Le label qui est affiche sur mon image doit apparaitre exactement comme c'est affiche sur l'ecran (dans mon picturebox "pbCheckImage01" 400x266).
    2- La methode utilisant DrawToBitmap permet de placer le label exactement ou je veux, seul probleme, l'image finale perd en resolution (explique dans mon post precedent). Et je ne vois pas de solution de ce cote la.
    3- La methode que j'utilise (voir code ci-dessous) marche presque parfaitement, c'est a dire que le label grossi tres legerement. J'utilise le nombre 3.16 pour avoir le resultat voulu.

    Mon image peut changer en terme de pixels (example 6016x4000 ou 2256x1504 ou 317x212 ... avec toujours le meme ratio 1.5).
    La taille du label peut changer via un FontDialog personalise et limite (taille 48 a 108).

    Ce que je ne comprends pas, c'est ce nombre 3.16 (3 n'est pas mal non plus, 1 ou 2 grossi le label et 4 ou 5 diminue le label).

    Si quelqu'un a une explication, je suis preneur.
    Merci,
    JLuc01

    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
                Dim myBitmap As Bitmap = Nothing
                Using fs As New System.IO.FileStream(myPath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
                    'Dim img2 As Image = Image.FromStream(fs)
                    Dim img2 As Bitmap = CType(Bitmap.FromStream(fs), Bitmap)
                    pbCheckImage01.BackgroundImage = img2
                    Dim g As Graphics = Graphics.FromImage(img2)
                    ' Text position of Label TGlass
                    Dim topleft As Point
                    topleft = New Point(TGlass.Left, TGlass.Top)
                    ' Text content of Label TGlass
                    Dim strCalendar As String = TGlass.Text
                    ' Rectangle layout for the selected font
                    Dim layout As New Rectangle(topleft, TGlass.Size)
                    ' Rectangle position with respect of the image
                    layout.X = CInt(layout.X * (img2.Height / pbCheckImage01.Height))
                    layout.Y = CInt(layout.Y * (img2.Width / pbCheckImage01.Width))
                    ' Text First Page
                    Dim myFontSize As Integer
                    myFontSize = CInt(TGlass.Font.Size * (img2.Width / pbCheckImage01.Width) / 3.16)
                    Dim myFont As New Font(TGlass.Font.FontFamily, myFontSize, TGlass.Font.Style)
                    Dim myBrush As New SolidBrush(TGlass.ForeColor)
                    ' Drawing on Image
                    g.DrawString(strCalendar, myFont, myBrush, layout.X, layout.Y)
                    ' Remove the TextWindow class
                    pbCheckImage01.Controls.Remove(TGlass)
                    myBitmap = img2
                End Using
                ' Update the new image on FirstPage
                pb00.BackgroundImage = myBitmap
                pb00.BackgroundImageLayout = ImageLayout.Stretch
                pb00.Size = fSizeTransfer(myBitmap.Width, myBitmap.Height, 120)
                ' Save (Replace) the Image in the right folder
                myBitmap.Save(myPath, System.Drawing.Imaging.ImageFormat.Jpeg)

Discussions similaires

  1. [HTML] HTML: Superposer du texte sur une image
    Par claralavraie dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 09/02/2006, 13h44
  2. [HTML][DREAMWEAVER] Texte sur une image
    Par Nicos77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 12/10/2005, 09h43
  3. Centrer un texte sur une image créée dynamiquement
    Par rigolman dans le forum Langage
    Réponses: 7
    Dernier message: 11/10/2005, 17h22
  4. Positionnement de texte sur une image
    Par inddzen dans le forum Windows
    Réponses: 2
    Dernier message: 08/08/2005, 12h22
  5. [HTML]Peut-on écrire un texte sur une image ?
    Par flogreg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 28/02/2005, 17h24

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