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#を使用しています。
これにより、単一のピクセルが設定されます。
e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
Henk Holtermanの答えの完全なコードを表示するだけです:
Brush aBrush = (Brush)Brushes.Black;
Graphics g = this.CreateGraphics();
g.FillRectangle(aBrush, x, y, 1, 1);
Graphics
オブジェクトにはこれがありません。これは抽象化であり、ベクトルグラフィックス形式をカバーするために使用できるためです。そのコンテキストでは、単一のピクセルを設定しても意味がありません。 Bitmap
画像形式にはGetPixel()
とSetPixel()
がありますが、それらに構築されたグラフィックスオブジェクトはありません。あなたのシナリオでは、一般的なグラフィックスオブジェクトに単一のピクセルを設定するための万能の方法はありませんので、あなたのオプションは本当に唯一のもののようですダブルバッファリングなどが可能です)
なぜ単一のピクセルを設定する必要があるのですか?
多くの単一ピクセルを描画する場合(カスタマイズされたさまざまなデータ表示用)、それらをビットマップに描画し、それを画面にブリットする傾向があります。
ビットマップGetPixelおよびSetPixel操作は、非常に多くの境界チェックを行うため、特に高速ではありませんが、ビットマップにすばやくアクセスできる「高速ビットマップ」クラスを作成するのは非常に簡単です。
これがあなたが探しているものだと思います。 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);
}
...
}
どうやらDrawLineは、実際に指定された長さより1ピクセル短い線を描画します。 DrawPoint/DrawPixel/whatnotはないようですが、代わりに幅と高さを1に設定したDrawRectangleを使用して1つのピクセルを描画できます。