web-dev-qa-db-ja.com

Windowsフォームで単一ピクセルを描画する

Windowsフォームで1つのピクセルをオンにしようとすると立ち往生します。

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

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

APIには実際に1つのピクセルの色を設定するメソッドが必要ですが、表示されません。

C#を使用しています。

87
Mark T

これにより、単一のピクセルが設定されます。

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

Henk Holtermanの答えの完全なコードを表示するだけです:

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

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

Graphicsオブジェクトにはこれがありません。これは抽象化であり、ベクトルグラフィックス形式をカバーするために使用できるためです。そのコンテキストでは、単一のピクセルを設定しても意味がありません。 Bitmap画像形式にはGetPixel()SetPixel()がありますが、それらに構築されたグラフィックスオブジェクトはありません。あなたのシナリオでは、一般的なグラフィックスオブジェクトに単一のピクセルを設定するための万能の方法はありませんので、あなたのオプションは本当に唯一のもののようですダブルバッファリングなどが可能です)

なぜ単一のピクセルを設定する必要があるのですか?

17
Adam Robinson

多くの単一ピクセルを描画する場合(カスタマイズされたさまざまなデータ表示用)、それらをビットマップに描画し、それを画面にブリットする傾向があります。

ビットマップGetPixelおよびSetPixel操作は、非常に多くの境界チェックを行うため、特に高速ではありませんが、ビットマップにすばやくアクセスできる「高速ビットマップ」クラスを作成するのは非常に簡単です。

9
Will Dean

GetHdcのMSDNページ

これがあなたが探しているものだと思います。 HDCを取得し、GDI呼び出しを使用してSetPixelを使用する必要があります。 GDIのCOLORREFは、BGRカラーを格納するDWORDであることに注意してください。アルファチャネルはなく、GDI +のカラー構造のようなRGBではありません。

これは、同じタスクを達成するために作成したコードの小さなセクションです。

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

どうやらDrawLineは、実際に指定された長さより1ピクセル短い線を描画します。 DrawPoint/DrawPixel/whatnotは​​ないようですが、代わりに幅と高さを1に設定したDrawRectangleを使用して1つのピクセルを描画できます。

1
Rytmis