2009-04-17 10 views
71

Windowsフォームで1つのピクセルをオンにしようとしています。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#を使用しています。

+0

私はいくつかの非常に素晴らしい科学グラフを作成しました(追加の機能は商用コントロールでは必要ありません)。私は、Xまたは+または小さなボックスでデータ点をプロットすることができます。しかし、重要でないデータについては、ただ1つのピクセルが必要です。 –

答えて

94

これは、単一のピクセルを設定します:

私は(様々なカスタマイズされたデータを表示するために)単一のピクセルの抽選だ、私はビットマップにそれらを描画する傾向があるし、画面上にそれをブリット
e.Graphics.FillRectangle(aBrush, x, y, 1, 1); 
+8

誰がDrawRectangleが2x2を描画すると推測しましたか?FillRectangeは同じ引数を使って1x1を描画しますか?ありがとう。 –

+8

@マーク:それは一種の意味を作っています...DrawRectangleは、「この幅と高さのxとyから始まるアウトラインを描画する」と言うので、開始点と終了点(x、y; x、y + 1; x + 1、y + 1)とそれらの間の線。 FillRectangleは「この幅と高さのx、yから始まる実線のサーフェスを描画します」と言っています。ちなみに、FillRectangleは、ペンではなくブラシです。 @ – Powerlord

+3

@ R。 Bemrose:実際には、あなたは 'DrawRectangle()'に渡すPenオブジェクトに依存します。 'Pen.Alignment = PenAlignment.Outset'を持っていれば、与えられた長方形の周りに' Pen.Width'ピクセルの太い輪郭線を描画します。しかし、 'Pen.Alignment = PenAlignment.Inset'を指定すると、指定された矩形の内側にPen.Widthピクセルの太い「アウトライン」が描画されます。 – Cipi

16

Graphicsオブジェクトは抽象であり、ベクターグラフィックス形式をカバーするために使用できるため、このオブジェクトはありません。この場合、1つのピクセルを設定することは意味をなさないでしょう。 BitmapイメージフォーマットはGetPixel()SetPixel()を持っていますが、グラフィックスオブジェクトは1つではありません。あなたのシナリオでは、あなたのオプションは本当に唯一のように思えます。なぜなら、一般的なグラフィックスオブジェクトに対して単一のピクセルを設定するためのすべての方法(そしてあなたのコントロール/フォームとして正確にはわからないからですダブルバッファリングなどが可能)

なぜ1つのピクセルを設定する必要がありますか?

1

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

+2

ニースは試してみましたが、サイズ1では2x2ピクセルを描画します。 (線の隣に描画すると、2倍の幅で表示されます)。サイズゼロの場合は、もちろん描画されません。 –

+0

私の間違いです。 :)良いことFillRectangleはトリックを行います。 – Rytmis

+0

しかし、DrawLineは短く描画されます。 – Joshua

8

ビットマップGetPixelとSetPixel操作は非常に多くのバウンドチェックを行うため、高速ではありませんが、ビットマップにすばやくアクセスできる「高速ビットマップ」クラスを作成するのは簡単です。ただ、ヘンクHoltermanの答えの完全なコード表示する

13

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

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

MSDN Page on GetHdc

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

これは私が同じタスクを実行するために書いたコードの小さなセクションです:DashStyle.DashStyle.Dotでペンを使用してライン2ピクセルの描画

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

は、単一のピクセルを描画します。

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); 
     } 
    } 
関連する問題