web-dev-qa-db-fra.com

Dessiner un seul pixel sur Windows Forms

Je suis coincé en essayant d'activer un seul pixel sur un Windows Form.

graphics.DrawLine(Pens.Black, 50, 50, 51, 50); // draws two pixels

graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels

L'API devrait vraiment avoir une méthode pour définir la couleur d'un pixel, mais je n'en vois pas.

J'utilise C #.

87
Mark T

Cela définira un seul pixel:

e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
110
Henk Holterman

Juste pour montrer le code complet pour la réponse de Henk Holterman:

Brush aBrush = (Brush)Brushes.Black;
Graphics g = this.CreateGraphics();

g.FillRectangle(aBrush, x, y, 1, 1);
17
WoodyDRN

L'objet Graphics ne le possède pas, car il s'agit d'une abstraction et pourrait être utilisé pour couvrir un format graphique vectoriel. Dans ce contexte, définir un seul pixel n'aurait aucun sens. Le format d'image Bitmap a GetPixel() et SetPixel(), mais pas un objet graphique construit sur celui-ci. Pour votre scénario, votre option semble vraiment être la seule car il n’existe pas de moyen unique de définir un seul pixel pour un objet graphique général (et vous ne savez pas EXACTEMENT de quoi il s'agit, car votre contrôle/formulaire pourrait être à double tampon, etc.)

Pourquoi avez-vous besoin de définir un seul pixel?

17
Adam Robinson

Là où je dessine beaucoup de pixels simples (pour différents affichages de données personnalisés), j'ai tendance à les dessiner en bitmap, puis à les blit sur l'écran.

Les opérations Bitmap GetPixel et SetPixel ne sont pas particulièrement rapides, car elles impliquent énormément de contrôles de contournement, mais il est assez facile de créer une classe 'bitmap rapide' disposant d'un accès rapide à un bitmap.

9
Will Dean

page MSDN sur GetHdc

Je pense que c'est ce que vous recherchez. Vous devrez vous procurer le HDC, puis utiliser les appels GDI pour utiliser SetPixel. Notez qu'un COLORREF dans GDI est un DWORD stockant une couleur BGR. Il n'y a pas de canal alpha, et ce n'est pas le RVB comme la structure de couleur de GDI +.

Voici une petite section de code que j'ai écrite pour accomplir la même tâche:

public class GDI
{
    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    internal static extern bool SetPixel(IntPtr hdc, int X, int Y, uint crColor);
}

{
    ...
    private void OnPanel_Paint(object sender, PaintEventArgs e)
    {
        int renderWidth = GetRenderWidth();
        int renderHeight = GetRenderHeight();
        IntPtr hdc = e.Graphics.GetHdc();

        for (int y = 0; y < renderHeight; y++)
        {
            for (int x = 0; x < renderWidth; x++)
            {
                Color pixelColor = GetPixelColor(x, y);

                // NOTE: GDI colors are BGR, not ARGB.
                uint colorRef = (uint)((pixelColor.B << 16) | (pixelColor.G << 8) | (pixelColor.R));
                GDI.SetPixel(hdc, x, y, colorRef);
            }
        }

        e.Graphics.ReleaseHdc(hdc);
    }
    ...
}
1
nor

Apparemment, DrawLine trace une ligne dont la longueur spécifiée est inférieure d’un pixel. Il ne semble pas exister de DrawPoint/DrawPixel/whatnot, mais vous pouvez utiliser DrawRectangle avec width et height définis sur 1 pour dessiner un seul pixel.

1
Rytmis