Я застрял, пытаясь включить один пиксель в 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);
источник
DrawRectangle()
. Если он есть,Pen.Alignment = PenAlignment.Outset
он будет рисоватьPen.Width
толстый контур пикселей вокруг данного прямоугольника. Но если вы укажете,Pen.Alignment = PenAlignment.Inset
он будет рисовать «контур» Pen.Width пикселей толщиной внутри данного прямоугольника.Просто чтобы показать полный код ответа Хенка Холтермана:
Brush aBrush = (Brush)Brushes.Black; Graphics g = this.CreateGraphics(); g.FillRectangle(aBrush, x, y, 1, 1);
источник
У
Graphics
объекта этого нет, поскольку он является абстракцией и может использоваться для покрытия формата векторной графики. В этом контексте установка одного пикселя не имеет смысла. ФорматBitmap
изображения имеетGetPixel()
иSetPixel()
, но не графический объект, построенный на нем. Для вашего сценария ваш вариант действительно кажется единственным, потому что нет универсального способа установить один пиксель для общего графического объекта (и вы не знаете ТОЧНО, что это такое, поскольку ваш элемент управления / форма может быть с двойной буферизацией и т. д.)Зачем нужно ставить один пиксель?
источник
Там, где я рисую много отдельных пикселей (для различных настраиваемых дисплеев данных), я обычно рисую их в растровом изображении, а затем переносю на экран.
Операции Bitmap GetPixel и SetPixel не особенно быстрые, потому что они выполняют очень много проверок границ, но довольно легко создать класс «быстрого растрового изображения», который имеет быстрый доступ к растровому изображению.
источник
Страница MSDN на GetHdc
Я думаю, это то, что вы ищете. Вам нужно будет получить HDC, а затем использовать вызовы GDI для использования SetPixel. Обратите внимание, что COLORREF в GDI - это DWORD, в котором хранится цвет BGR. Нет альфа-канала, и это не RGB, как цветовая структура GDI +.
Это небольшой фрагмент кода, который я написал для выполнения той же задачи:
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 рисует линию, длина которой на один пиксель меньше фактической указанной длины. Кажется, нет DrawPoint / DrawPixel / еще чего-то, но вместо этого вы можете использовать DrawRectangle с шириной и высотой, установленными на 1, для рисования одного пикселя.
источник
Рисование линии 2 пикселя с помощью пера с DashStyle.DashStyle.Dot рисует один пиксель.
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); } }
источник