Utknąłem, próbując włączyć pojedynczy piksel w formularzu systemu Windows.
graphics.DrawLine(Pens.Black, 50, 50, 51, 50); // draws two pixels
graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels
API naprawdę powinno mieć metodę ustawiania koloru jednego piksela, ale jej nie widzę.
Używam C #.
Odpowiedzi:
Spowoduje to ustawienie pojedynczego piksela:
e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
źródło
DrawRectangle()
. Jeśli tak,Pen.Alignment = PenAlignment.Outset
to narysujePen.Width
obrys o grubości pikseli wokół danego prostokąta. Ale jeśli to określiszPen.Alignment = PenAlignment.Inset
, narysuje "kontur" o grubości Pen.Width pikseli wewnątrz danego prostokąta.Aby pokazać pełny kod odpowiedzi Henka Holtermana:
Brush aBrush = (Brush)Brushes.Black; Graphics g = this.CreateGraphics(); g.FillRectangle(aBrush, x, y, 1, 1);
źródło
Graphics
Obiekt nie posiada tego, ponieważ jest abstrakcją i mogą być wykorzystane do pokrycia format grafiki wektorowej. W tym kontekście ustawienie pojedynczego piksela nie miałoby sensu.Bitmap
Format obrazu maGetPixel()
aSetPixel()
, ale nie jest to obiekt graficzny zbudowany na jednym. W twoim scenariuszu twoja opcja naprawdę wydaje się jedyną, ponieważ nie ma jednego uniwersalnego sposobu na ustawienie pojedynczego piksela dla ogólnego obiektu graficznego (i nie wiesz DOKŁADNIE, co to jest, ponieważ twoja kontrolka / forma może być podwójnie buforowany itp.)Dlaczego musisz ustawić pojedynczy piksel?
źródło
Kiedy rysuję wiele pojedynczych pikseli (dla różnych niestandardowych wyświetlania danych), zwykle rysuję je na mapie bitowej, a następnie umieszczam na ekranie.
Operacje Bitmap GetPixel i SetPixel nie są szczególnie szybkie, ponieważ wykonują bardzo dużo kontroli granic, ale dość łatwo jest utworzyć klasę „szybkiej bitmapy”, która ma szybki dostęp do mapy bitowej.
źródło
Strona MSDN w witrynie GetHdc
Myślę, że właśnie tego szukasz. Będziesz musiał pobrać HDC, a następnie użyć wywołań GDI, aby użyć SetPixel. Zauważ, że COLORREF w GDI to DWORD przechowujący kolor BGR. Nie ma kanału alfa i nie jest to RGB jak struktura kolorów GDI +.
To jest mała sekcja kodu, który napisałem, aby wykonać to samo zadanie:
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); } ... }
źródło
Wygląda na to, że DrawLine rysuje linię, która jest o jeden piksel krótsza od rzeczywistej określonej długości. Wygląda na to, że nie ma DrawPoint / DrawPixel / whatnot, ale zamiast tego możesz użyć DrawRectangle z szerokością i wysokością ustawioną na 1, aby narysować pojedynczy piksel.
źródło
Rysowanie linii 2px za pomocą pióra z DashStyle.DashStyle.Dot rysuje pojedynczy piksel.
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); } }
źródło