Windows Forms에서 단일 픽셀 그리기


93

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 #을 사용하고 있습니다.


매우 멋진 과학적 그래프를 그리는 컨트롤을 만들었습니다 (상용 컨트롤에서는 사용할 수없는 추가 기능 포함). X 또는 + 또는 작은 상자로 데이터 포인트를 그릴 수 있습니다. 그러나 중요하지 않은 데이터의 경우 단일 픽셀 만 원합니다.
Mark T

내가 보는 모든 대답은 실제로 단일 픽셀에 대해 과잉 인 것 같습니까? buffer [y * width + x] = color;
NoMoreZealots

답변:


114

이것은 단일 픽셀을 설정합니다.

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

18
DrawRectangle이 2x2를 그리지 만 FillRectange가 동일한 인수로 1x1을 그린다고 누가 짐작했을까요? 감사.
Mark T

9
@Mark : 일종의 의미가 있습니다. DrawRectangle은 "이 너비와 높이의 x와 y에서 시작하는 윤곽선을 그립니다"라고 말하므로 시작점과 끝점 (x, y; x + 1, y)을 모두 그립니다. ; x, y + 1; x + 1, y + 1) 및 그 사이의 선. FillRectangle은 "이 너비와 높이의 x, y에서 시작하는 단단한 표면을 그립니다."라고 말합니다. 덧붙여서 FillRectangle은 펜이 아닌 브러시를 사용합니다.
Powerlord 2009

5
@아르 자형. Bemrose : 실제로 전달하는 Pen 개체에 따라 다릅니다 DrawRectangle(). 그것이 있다면 주어진 직사각형 주위에 픽셀 두께의 윤곽선 Pen.Alignment = PenAlignment.Outset을 그릴 것입니다 Pen.Width. 그러나 지정 Pen.Alignment = PenAlignment.Inset하면 주어진 사각형 안에 Pen.Width 픽셀 두께의 "윤곽선"이 그려집니다.
Cipi 2011

2
이것은 매우 불만족스러운 답변입니다. 단일 픽셀을 설정하지만 항상 리터럴 픽셀을 설정해야하는 것은 아닙니다. 저는 항상 이것을 필요로했습니다. 이것은 종종 붓이 아닌 선을 그리는 것과 같은 펜으로 점을 그릴 필요가있었습니다. 즉, 2 픽셀보다 짧은 선이 필요합니다. 나는 그것이 OP에 필요한 것이라고 생각합니다.
RobertT

6
이 대답이 마음에 들지 않습니다. 이 방법은 매우 비효율적입니다.
user626528 2013-02-22

19

Henk Holterman 답변에 대한 완전한 코드를 보여주기 위해 :

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

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

18

Graphics은 추상화 그리고 벡터 그래픽 포맷을 충당하는 데 사용될 수 있기 때문에 목적이 없습니다. 그런 맥락에서 단일 픽셀을 설정하는 것은 의미가 없습니다. Bitmap이미지 형식 있는가 GetPixel()SetPixel(),하지만 그래픽 하나에 내장 된 개체가 아닙니다. 시나리오의 경우 일반 그래픽 개체에 대해 단일 픽셀을 설정하는 한 가지 방법이 없기 때문에 옵션이 실제로 유일한 것처럼 보입니다 (컨트롤 / 양식으로 정확히 무엇인지 알 수 없습니다. 이중 버퍼링 등)

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


9

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

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


2

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

1

분명히 DrawLine은 실제 지정된 길이보다 1 픽셀 짧은 선을 그립니다. DrawPoint / DrawPixel / whatnot이없는 것 같지만 대신 너비와 높이가 1로 설정된 DrawRectangle을 사용하여 단일 픽셀을 그릴 수 있습니다.


2
좋은 시도이지만 크기 1에서는 2x2 픽셀을 그립니다. (선 옆에 그리면 너비가 두 배인 것을 볼 수 있습니다.) 그리고 크기가 0이면 당연히 아무것도 그려지지 않습니다.
Mark T

맞다, 내 실수. :) FillRectangle이 다행입니다.
Rytmis 2009

0

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);
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.