Saya terjebak saat mencoba mengaktifkan satu piksel pada Formulir Windows.
graphics.DrawLine(Pens.Black, 50, 50, 51, 50); // draws two pixels
graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels
API seharusnya memiliki metode untuk mengatur warna satu piksel, tetapi saya tidak melihatnya.
Saya menggunakan C #.
Jawaban:
Ini akan menetapkan satu piksel:
e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
sumber
DrawRectangle()
. Jika memilikinya,Pen.Alignment = PenAlignment.Outset
itu akan menggambarPen.Width
garis tebal piksel di sekeliling persegi panjang yang diberikan. Tetapi jika Anda menentukannyaPen.Alignment = PenAlignment.Inset
, Pen.Width piksel akan menggambar "garis tepi" tebal di dalam persegi panjang yang diberikan.Sekadar menunjukkan kode lengkap untuk jawaban Henk Holterman:
Brush aBrush = (Brush)Brushes.Black; Graphics g = this.CreateGraphics(); g.FillRectangle(aBrush, x, y, 1, 1);
sumber
The
Graphics
objek tidak memiliki ini, karena ini merupakan abstraksi dan dapat digunakan untuk menutupi format grafis vektor. Dalam konteks itu, menyetel satu piksel tidak masuk akal. TheBitmap
format gambar memang memilikiGetPixel()
danSetPixel()
, tetapi tidak objek grafis yang dibangun di atas satu. Untuk skenario Anda, opsi Anda benar-benar tampak seperti satu-satunya karena tidak ada satu-satunya cara untuk menetapkan satu piksel untuk objek grafik umum (dan Anda tidak tahu PERSIS apa itu, sebagai kontrol / bentuk Anda. bisa menjadi buffer ganda, dll.)Mengapa Anda perlu menyetel satu piksel?
sumber
Saat saya menggambar banyak piksel tunggal (untuk berbagai tampilan data yang disesuaikan), saya cenderung menggambarnya ke bitmap dan kemudian memadukannya ke layar.
Operasi Bitmap GetPixel dan SetPixel tidak terlalu cepat karena melakukan banyak pemeriksaan batas, tetapi cukup mudah untuk membuat kelas 'bitmap cepat' yang memiliki akses cepat ke bitmap.
sumber
Halaman MSDN di GetHdc
Saya pikir inilah yang Anda cari. Anda perlu mendapatkan HDC dan kemudian menggunakan panggilan GDI untuk menggunakan SetPixel. Perhatikan, bahwa COLORREF di GDI adalah DWORD yang menyimpan warna BGR. Tidak ada saluran alfa, dan itu bukan RGB seperti struktur Warna GDI +.
Ini adalah bagian kecil dari kode yang saya tulis untuk menyelesaikan tugas yang sama:
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); } ... }
sumber
Rupanya DrawLine menggambar garis yang satu piksel pendek dari panjang yang ditentukan sebenarnya. Sepertinya tidak ada DrawPoint / DrawPixel / yang lainnya, tetapi Anda dapat menggunakan DrawRectangle dengan lebar dan tinggi disetel ke 1 untuk menggambar satu piksel.
sumber
Menggambar Garis 2px menggunakan Pena dengan DashStyle.DashStyle.Dot menggambar satu Pixel.
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); } }
sumber