Frage

Ich bin festgefahren, um ein einzelnes Pixel auf einem Windows -Formular einzuschalten.

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

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

Die API sollte wirklich eine Methode haben, um die Farbe eines Pixels festzulegen, aber ich sehe keine.

Ich benutze C#.

War es hilfreich?

Lösung

Dadurch wird ein einzelnes Pixel festgelegt:

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

Andere Tipps

Das Graphics Das Objekt hat dies nicht, da es sich um eine Abstraktion handelt und verwendet werden kann, um ein Vektorgrafikformat abzudecken. In diesem Zusammenhang würde das Festlegen eines einzelnen Pixels keinen Sinn machen. Das Bitmap Bildformat hat GetPixel() und SetPixel(), aber kein Grafikobjekt, das auf einem basiert. Für Ihr Szenario scheint Ihre Option wirklich die einzige zu sein Könnte doppelt gepuffert sein usw.)

Warum müssen Sie ein einzelnes Pixel festlegen?

Nur um den vollständigen Code für Henk Holterman zu zeigen. Antwort:

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

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

Wo ich viele einzelne Pixel zeichne (für verschiedene individuelle Datenanzeigen), zeichne ich sie in eine Bitmap und blühen Sie dann auf den Bildschirm.

Die Bitmap GetPixel- und SetPixel -Operationen sind nicht besonders schnell, da sie eine Menge Boundschecking ausführen, aber es ist ziemlich einfach, eine "schnelle Bitmap" -Klasse zu erstellen, die einen schnellen Zugriff auf eine Bitmap hat.

Anscheinend zeichnet die Drawline eine Linie, die ein Pixel vor der tatsächlichen angegebenen Länge ist. Es scheint kein Drawpoint/Drawpixel/so weiter zu geben, aber stattdessen können Sie DrawRectangle mit Breite und Höhe auf 1 verwenden, um ein einzelnes Pixel zu zeichnen.

MSDN -Seite auf Gethdc

Ich denke, das ist es, wonach Sie suchen. Sie müssen den HDC erhalten und dann die GDI -Aufrufe verwenden, um SETPixel zu verwenden. Beachten Sie, dass ein ColorRef in GDI ein DWORD ist, das eine BGR -Farbe speichert. Es gibt keinen Alpha -Kanal, und es ist nicht RGB wie die Farbstruktur von GDI+.

Dies ist ein kleiner Codeabschnitt, den ich geschrieben habe, um dieselbe Aufgabe zu erfüllen:

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);
    }
    ...
}

Zeichnen Sie eine Linie 2PX mit einem Stift mit Dasstyle.dashstyle.Dot zeichnet ein einzelnes Pixel.

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        using (Pen p = new Pen(Brushes.Black))
        {
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            e.Graphics.DrawLine(p, 10, 10, 11, 10);
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top