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 :

Bitmap et chaîne de caractères [Débutant]


Sujet :

VB.NET

  1. #1
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut Bitmap et chaîne de caractères
    Bonjour Madame, Monsieur.

    J'ai constaté un dysfonctionnement dans le dessin d'une chaîne de caractères sur un bitmap. Voici le code qui met cela en évidence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub Accueil_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            DessinerSurForm()
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub bTst_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bTst.Click
            DessinerSurBitmap()
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Sub DessinerSurForm()
            Dim Des As Graphics
            Des = Me.CreateGraphics()
     
            Dim Crn As New Pen(Color.Black, 1)
            Dim Pnc As New SolidBrush(Color.Black)
            Dim Fnt As New Font("Times New Roman", 10, FontStyle.Regular)
            Dim Pnt As New PointF(1, 1)
            Des.DrawString("Point", Fnt, Pnc, Pnt)
            Des.DrawRectangle(Crn, 0, 0, 40, 15)
     
            Des.Dispose()
        End Sub
    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 DessinerSurBitmap()
            Dim Bmp As Bitmap = New Bitmap(200, 200)
            Dim Des As Graphics = Graphics.FromImage(Bmp)
     
            Dim Crn As New Pen(Color.Black, 1)
            Dim Pnc As New SolidBrush(Color.Black)
            Dim Fnt As New Font("Times New Roman", 10, FontStyle.Regular)
            Dim Pnt As New PointF(1, 1)
            Des.DrawString("Point", Fnt, Pnc, Pnt)
            Des.DrawRectangle(Crn, 0, 0, 40, 15)
     
            pBox.Image = Bmp.Clone : Bmp.Dispose()
            Des.Dispose()
        End Sub
    Le programme ne contient qu'un objet Form nommé Accueil, sur lequel sont déposés un bouton de commande bTst et un contrôle PictureBox nommé pBox. Par ailleurs les quatre procédures ci-dessus sont contenus dans la partie code de la Form.
    J'attire votre attention sur le fait que les lignes 5 à 10 des deux dernières procédures sont absolument identiques. Or, après un clic sur le bouton bTst, les textes apparaissant sur Accueil et sur pBox sont différents. Le premier ressemble à ce que l'on obtient et tapant du texte dans Word. Le second est un affreux pâté. Qui pourrait me dire comment corriger cela ?

    Merci d'avance.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    déjà en théorie il faut dessiner dans l'event paint, tout ce qui est dessiné ailleurs est susceptible d'être effacé sans préavis

    dans l'event paint il y a un graphics de fourni dans e.graphics, il ne faut alors pas faire creategraphics sinon même chose qu'avant

    sur le new bitmap, cherche une surcharge qui permet de préciser la qualité, voir aussi si les dpi sont bien sur 96 dans les 2 cas

    quand 2 méthodes font la même chose à un truc près, on écrit pas 2 méthodes, mais on fait une méthode générique

    pourquoi cloner puis disposer ensuite ? autant fournir le bmp et ne pas le disposer ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Merci beaucoup, je vais essayer d'appliquer vos conseils.

  4. #4
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Je suppose qu'il s'agit de vérifier les dpi de la Form et du bitmap, et qu'ils ont tous deux pour cela une propriété commune. Mais comment se nomme-t-elle ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    disons que c'est une piste
    les dpi sont sur la classe graphics (dpix et dpiy)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Les dpi sont bien partout à 96.
    J'ai examiné les surcharges sur le New Bitmap. Elles font appel à des notions dont je n'ai aucune idée. Je suis un vieux Vbsixien, et un tout jeune Vbnetien. Pourriez-vous m'aider sur cet aspect des choses ?

    Remerciements anticipés.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    C'est encore moi !

    Le Format 32bppArgb et ceux qui le suivent donnent tous le même mauvais résultat que sans l'utilisation de l'argument PixelFormat : le texte affiché dans le PictureBox est empâté, au point d'être illisible en 10 points. Et avec les formats qui précèdent 32bppArgb, le PictureBox n'affiche rien.
    Cela pourrait-il provenir du PictureBox ? La question se pose parce que le rectangle que j'ai dessiné autour du texte s'affiche correctement.

    L'affaire se corse, ne trouvez-vous pas ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    essayez bmp.Save("x:\dossier\fichier.png",imageformat.png)
    ca créé un fichier sur le disque, s'il est moche ca vient du code, s'il est beau ca vient du pctbox
    si c'est le pctbox il faudrait voir s'il n'est pas défini sur strech ou zoom, qui peut avoir pour effet d'enlaidir l'image
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Bonjour Pol63

    J'ai bien essayé la sauvegarde sur disque : c'est moche. Le PictureBox n'est donc pas en cause, ce qui nous ramène au code. Or, après avoir tenu compte de toutes les critiques (justifiées) que vous m'avez faites, il m'est apparu que ce code est conforme aux indications que l'on trouve sur msdn.
    Je me demande si quelqu'un a déjà vérifié que ce code proposé par VB 2010 (Express) fonctionne proprement. Qu'en pensez vous ?

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour
    c'est peut être plus du au "rendu" du systeme d'exploitation.
    Essayez TextRenderingHint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Des.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
            Des.DrawString("Point", Fnt, Pnc, Pnt)
    Au besoin, testez les autres propriétés TextRenderingHint.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 194
    Par défaut
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Des.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
    Des.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    Des.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
    pas de défauts
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre très actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Par défaut
    Bonjour à Pol63 et à chrismonoye.

    La première proposition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Des.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
            Des.DrawString("Point", Fnt, Pnc, Pnt)
    a réglé le problème. Cela fonctionne aussi avec la proposition plus complète.

    Un grand merci à tous deux.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  3. Chaînes de caractères
    Par Zazeglu dans le forum C
    Réponses: 3
    Dernier message: 28/08/2003, 16h20
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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