[c#] Windows Forms에서 단일 픽셀 그리기

Windows Form에서 단일 픽셀을 켜려고 노력 중입니다.

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

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

API에는 실제로 한 픽셀의 색상을 설정하는 메서드가 있어야하지만 하나는 표시되지 않습니다.

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(),하지만 그래픽 하나에 내장 된 개체가 아닙니다. 시나리오의 경우 일반 그래픽 개체에 대해 단일 픽셀을 설정하는 한 가지 방법이 없기 때문에 옵션이 실제로 유일한 것처럼 보입니다 (컨트롤 / 양식으로 정확히 무엇인지 알 수 없습니다. 이중 버퍼링 등)

단일 픽셀을 설정해야하는 이유는 무엇입니까?


답변

단일 픽셀을 많이 그리는 경우 (다양한 사용자 지정 데이터 표시 용), 비트 맵으로 그린 ​​다음 화면에 블릿을 표시하는 경향이 있습니다.

Bitmap GetPixel 및 SetPixel 작업은 많은 경계 검사를 수행하기 때문에 특별히 빠르지는 않지만 비트 맵에 빠르게 액세스 할 수있는 ‘빠른 비트 맵’클래스를 만드는 것은 매우 쉽습니다.


답변

GetHdc의 MSDN 페이지

나는 이것이 당신이 찾고있는 것이라고 생각합니다. HDC를 가져온 다음 GDI 호출을 사용하여 SetPixel을 사용해야합니다. GDI의 COLORREF는 BGR 색상을 저장하는 DWORD입니다. 알파 채널이없고 GDI +의 Color 구조처럼 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을 사용하여 단일 픽셀을 그릴 수 있습니다.


답변

DashStyle.DashStyle.Dot와 함께 펜을 사용하여 2px 선을 그리면 단일 픽셀이 그립니다.

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