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 :

Maitriser le Font avec Graphic


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 Maitriser le Font avec Graphic
    Bonsoir,

    Cette nouvelle discussion fait suite a la precedente, mais j'ai un peu evolue depuis.
    Au lieu de copier un controle sur une image (Screenshot), je construis moi-meme le "controle" avec Graphic. Un peu plus complique, mais cela me donne plus de marge.

    Lorsque je cree une forme (par exemple, un rectangle) sur une image, pour garder les proportions par rapport a la "Size" de l'image, je dois faire quelquechose de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Using g As Graphics = Graphics.FromImage(img)
          g.FillRectangle(Brushes.Gray, New Rectangle(img.Width * 0.55, img.Height * 0.05, img.Width * 0.4, img.Height * 0.05))
    ...etc...
    Par contre, pour garder la bonne proportion du "Font" en fonction de l'image choisie, cela parait plus difficile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim drawString As String = "Sample"
    Dim drawFont As New System.Drawing.Font("Arial", 16)
    Dim drawBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Black)
    Dim x As Single = img.Width * 0.66
    Dim y As Single = img.Height * 0.055
    g.DrawString(drawString, drawFont, drawBrush, x, y)
    Comment calculer le "Font" (16 ci-dessus) en gardant les proportions par rapport a la "Size" de l'image?
    Car dans ce cas, un charactere depend de "Width" et "Height". Le charactere est en quelque sorte en 2D.
    Il y a peut-etre une astuce que je ne connais pas.

    Par exemple, sur une meme taille d'ecran:
    Image 1: 6000x4000 avec Font("Arial", 16) donne un mot ecrit tres petit.
    Image 2: 1000x800 avec Font("Arial", 16) donne un mot ecrit plus gros.
    Je desire reduire la photo a une taille bien precise quelquesoit l'image originale (image 1 ou 2), et donc avoir le meme "Font".

    En esperant avoir expose mon probleme clairement.

    Toute suggestion/idee est bienvenue.

    Merci,
    JLuc01

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

    Pour information:

    Je pense avoir trouver de bonnes idees, voire la solution, sur ce lien:http://stackoverflow.com/questions/7...string-on-an-I
    Au cas ou ma question n'etait pas comprehensible, le lien ci-dessus presente peut-etre la question plus clairement.

    Finalement, il parait peut-etre plus interessant de choisir une taille d'image, de la sauver en bmp et alors de choisir le font que l'on veut.
    Ainsi, pas d'ajustement necessaire.

    Si toutefois, vous avez d'autres idees ou suggestions, n'hesitez pas.
    Je met en resolu.

    A+
    Jean-Luc

  3. #3
    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
    Le code suggéré par le lien est un expédient comme un autre...
    Cela est du au fait que la taille du Font qu'on spécifie dans le Ctor vaut uniquement pour le Height du Font...
    Cette taille est spécifie en Pixel(DPI) mais son origine vient dans l'API de l'unité Point(=1/72eme d'un Inch ou Pouce) des fondeurs de caractère de l'imprimerie .
    La taille exprime en Point est appelée "design size "
    La relation entre taille en Point et Pixel est donné ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Dim g As Graphics = Me.CreateGraphics()
    ' A 12-point font will be 16 pixels high on a 96-dpi monitor
    Dim dpi As Single = g.DpiY
    Dim points As Single = 12
    Dim pixels As Single = (points * dpi)/72

    La largeur des caractères en "design size" varie en fonction du caractère ("i" ,"k", "w" ,"m" n'ont pas la même largeur..)...
    NB: cela justifie l'existence de la fonction Graphics.MeasureString(mystring,myfont) dont le rôle est de nous fournir la largeur cumulé en Pixel des caractères de la chaine ....
    De plus la Hauteur restituée par cette fonction est 114% de la taille du myfont
    ...

    l'exemple code .vb est base sur la relation Point -Pixel et le rectangle de disposition de la chaine mis à l'échelle par tes soins:

    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
     
    Public Class FormFontImage
        Private scaleF As New SizeF(0.04, 0.05)
        Private Sub FormFontImage_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
            PictureBox2.SizeMode = PictureBoxSizeMode.AutoSize
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim img As Bitmap = New Bitmap(My.Resources.Koala, 6000, 4000)
            Dim layoutRect As New Rectangle(0, 0, img.Width * scaleF.Width, img.Height * scaleF.Height)
            Using g As Graphics = Graphics.FromImage(img)
                g.FillRectangle(Brushes.Aquamarine, layoutRect)
                Dim drawString As String = "Sample"
     
                Dim dpi As Single = g.DpiY
                Dim points As Single = layoutRect.Width / drawString.Length
                Dim emSize As Single = (points * dpi) / 72
     
                Using drawFont As New Font("Arial", emSize, FontStyle.Regular, GraphicsUnit.Pixel)
                    Using drawBrush As New SolidBrush(Color.Red)
                        Dim x As Single = 0
                        Dim y As Single = 0
                        'g.DrawString(drawString, drawFont, drawBrush, x, y)
                        g.DrawString(drawString, drawFont, drawBrush, layoutRect, StringFormat.GenericTypographic)
                    End Using
                End Using
            End Using
     
            PictureBox1.Image = img
     
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim img As Bitmap = New Bitmap(My.Resources.Koala, 1000, 808)
            Dim layoutRect As New Rectangle(0, 0, img.Width * scaleF.Width, img.Height * scaleF.Height)
            Using g As Graphics = Graphics.FromImage(img)
                g.FillRectangle(Brushes.Aquamarine, layoutRect)
                Dim drawString As String = "Sample"
     
                Dim dpi As Single = g.DpiY
                Dim points As Single = layoutRect.Width / drawString.Length
                Dim emSize As Single = (points * dpi) / 72
     
                Using drawFont As New Font("Arial", emSize, FontStyle.Regular, GraphicsUnit.Pixel)
     
                    Using drawBrush As New SolidBrush(Color.Red)
                        Dim x As Single = 0
                        Dim y As Single = 0
                        'g.DrawString(drawString, drawFont, drawBrush, x, y)
                        g.DrawString(drawString, drawFont, drawBrush, layoutRect, StringFormat.GenericTypographic)
                    End Using
                End Using
     
     
            End Using
            PictureBox2.Image = img
        End Sub
    End Class
    bon code....

  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
    Bonsoir,

    OK.Merci pour ces precisions.
    Je crois comprendre un peu mieux le sujet, meme si ce n'est pas un domaine facile a maitriser.

    JLuc01

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

Discussions similaires

  1. Chargement de font avec SDL_RWFromMem
    Par zais_ethael dans le forum SDL
    Réponses: 9
    Dernier message: 30/08/2006, 15h50
  2. NullPointerException avec Graphics?
    Par charaf dans le forum Graphisme
    Réponses: 7
    Dernier message: 20/06/2006, 11h25
  3. débutant->prob avec Graphics
    Par ataya dans le forum 2D
    Réponses: 12
    Dernier message: 02/05/2006, 16h26
  4. Dessiner une figure avec graphics.h
    Par Firas_tn dans le forum C
    Réponses: 2
    Dernier message: 29/03/2006, 20h33
  5. Fonts avec c++ Builder
    Par Arnaud-h dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/03/2004, 11h04

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