FAQ C#Consultez toutes les FAQ

Nombre d'auteurs : 41, nombre de questions : 272, dernière mise à jour : 1er novembre 2017  Ajouter une question

 

Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées concernant C# sur le forum Développement DotNET

Je tiens à souligner qu'elle ne garantit en aucun cas que les informations qu'elle contient sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci .

Sur ce, je vous souhaite une bonne lecture.

Commentez cette FAQ : Commentez


SommaireWinFormsGDI+ (6)
précédent sommaire suivant
 

Cette définition est tirée de MSDN.

Le Common Language Runtime recourt à une implémentation avancée de l'interface graphique (GDI, Graphics Design Interface) Windows, appelée GDI+. GDI+ vous permet de créer des graphiques, de dessiner du texte et de manipuler des images graphiques en tant qu'objets. Cette interface est conçue pour allier performances et simplicité d'utilisation. Vous pouvez l'utiliser en vue du rendu des images graphiques sur des Windows Forms et des contrôles. GDI+ a entièrement remplacé GDI et constitue aujourd'hui la seule option disponible pour le rendu des graphiques par programme dans les applications Windows Forms.

Mis à jour le 2 janvier 2007 Jérôme Lambert

Voici une méthode permettant de convertir une image en un tableau de bytes :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static Byte[] Image2ByteArray(Image img) 
{ 
    try 
    { 
        MemoryStream mstImage = new MemoryStream(); 
        img.Save(mstImage, System.Drawing.Imaging.ImageFormat.Jpeg); 
        Byte[] bytImage = mstImage.GetBuffer(); 
        return bytImage; 
    } 
    catch (Exception ex) 
    { 
        return null; 
    } 
}

Mis à jour le 22 août 2006 loic38760

Voici une méthode permettant de convertir un tableau de bytes en image :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
public static Image ByteArray2Image(Byte[] BArray) 
{ 
    try 
    { 
        MemoryStream mstImage = new MemoryStream(BArray); 
        Image img = Image.FromStream(mstImage); 
        return img; 
    } 
    catch (Exception ex) 
    { return null; } 
}

Mis à jour le 22 août 2006 loic38760

Ce code permet de réaliser simplement une capture d'écran de la fenêtre active et de l'écran en entier. Le principe est de simuler l'appui sur la touche « Impr écran » puis de récupérer l'image obtenue dans le Presse-Papier. Pour l'exemple donné ci-dessous, les résultats sont affichés dans deux PictureBox : PBWindow, PBScreen après le clic sur un Button BPrint.

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void BPrintClick(object sender, System.EventArgs e) 
{ 
    Bitmap screen; 
    Bitmap window; 
  
    // simuler l'appui de la touche PrintScreen 
    SendKeys.SendWait("{PRTSC}"); 
    // récupérer l'image obtenue dans le Presse-Papier 
    window = ((Bitmap)(Clipboard.GetDataObject().GetData("Bitmap"))); 
    // attribuer l'image à PBWindow 
    PBWindow.Image = window; 
  
    // simuler le PrintScreen enrichi 
    SendKeys.SendWait("+{PRTSC}"); 
    // récupérer l'image obtenue dans le Presse-Papier 
    screen = ((Bitmap)(Clipboard.GetDataObject().GetData("Bitmap"))); 
    // attribuer l'image à PBScreen 
    PBScreen.Image = screen; 
}

Mis à jour le 22 août 2006 saline

La classe Graphics possède une méthode MeasureString permettant de connaître la taille exacte d'une chaine de caractères en fonction de la Font utilisée :

Code c# : Sélectionner tout
1
2
3
System.Drawing.Graphics g = textBox1.CreateGraphics(); 
System.Drawing.SizeF objSizeF = g.MeasureString(textBox1.Text, textBox1.Font); 
System.Windows.Forms.MessageBox.Show(string.Format("Votre texte '{0}' a une longueur de {1} pixeles.", textBox1.Text, objSizeF.Width));

Mis à jour le 10 juin 2008 Jérôme Lambert

Voilà une petite classe pour faire cela…

L'idée (simple) est de pouvoir fournir une Region associée à une image.

L'intérêt est de pouvoir ensuite avoir des forms, ou des contrôles qui auront pour zone de sélection l'image.

Voici le code

Code c# : Sélectionner tout
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Drawing.Imaging; 
using System.IO; 
  
namespace RegionBuilder 
{ 
    public static class Tools 
    { 
        public static Region NewRegionForm(Color cTrans, string filename, Rectangle clientRec) 
        { 
            if (File.Exists(filename)) 
            { 
                Bitmap bmp = new Bitmap(filename); 
                return NewRegionForm(cTrans,bmp,clientRec); 
            } 
            return new Region(clientRec); 
        } 
  
        public static Region NewRegionForm(Color cTrans, Bitmap b, Rectangle clientRec) 
        { 
            int ct = cTrans.ToArgb(); 
            Rectangle r = new Rectangle(0, 0, 1, 1); 
            GraphicsPath gpRemoved = new GraphicsPath(FillMode.Winding); 
            BitmapData bd = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
            int h = b.Height; 
            int w = b.Width; 
            int[,] mat = new int[h, w]; 
            int curj = 0; 
            int nb = 0; 
            bool canAdd = false; 
            unsafe 
            { 
                int* pi = (int*)bd.Scan0.ToInt32() - 1; 
                for (int i = 0; i < h; i += 1) 
                { 
                    for (int j = 0; j < w; j += 1) 
                    { 
                        pi++; 
  
                        if (*pi == ct) 
                        { 
                            r.X = j; 
                            r.Y = i; 
                            mat[i, j] = 1; 
                            if (canAdd) 
                            { 
                                mat[i, j] = 0; 
                                nb++; 
                            } 
                            else 
                            { 
                                mat[i, curj] = nb; 
                                curj = j; 
                                canAdd = true; 
                                nb = 1; 
                            } 
                        } 
                        else 
                        { 
                            mat[i, j] = -1; 
                            if (canAdd) 
                            { 
                                canAdd = false; 
                                mat[i, curj] = nb; 
                                nb = 0; 
                            } 
                            curj = j; 
                        } 
                    } 
                    if (canAdd) 
                    { 
                        canAdd = false; 
                        mat[i, curj] = nb; 
                        nb = 0; 
                        curj = 0; 
                    } 
                } 
            } 
  
            for (int i = 0; i < h; i += 1) 
            { 
                for (int j = 0; j < w; j += 1) 
                { 
                    if (mat[i, j] > 1) 
                    { 
                        r.Width = mat[i, j]; 
                        r.X = j; 
                        r.Y = i; 
                        j += (mat[i, j] - 1); 
                        gpRemoved.AddRectangle(r); 
                    } 
                    else if (mat[i, j] == 1) 
                    { 
  
                        r.Width = 1; 
                        r.X = j; 
                        r.Y = i; 
                        gpRemoved.AddRectangle(r); 
                    } 
                } 
            } 
  
            b.UnlockBits(bd); 
            Region a = null; 
            a = new Region(clientRec); 
            a.Exclude(gpRemoved); 
            gpRemoved.Dispose(); 
            return a; 
        } 
    } 
}

Mis à jour le 10 juin 2008 theMonz31

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -