2009-04-17 12 views
71

पर एक सिंगल पिक्सेल ड्रा करें मैं विंडोज फॉर्म पर एक पिक्सेल चालू करने की कोशिश कर रहा हूं।विंडोज फॉर्म

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

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

एपीआई वास्तव में एक पिक्सेल के रंग को सेट करने के लिए एक विधि होनी चाहिए, लेकिन मुझे एक नहीं दिखाई देता है।

मैं सी # का उपयोग कर रहा हूं।

+0

मैं एक नियंत्रण जो कुछ बहुत अच्छा वैज्ञानिक रेखांकन (जोड़ा क्षमताओं मैं किसी भी व्यावसायिक नियंत्रण में उपलब्ध नहीं की जरूरत है) के साथ भूखंडों बनाया है। मैं डेटा बिंदु और एक्स या ए + या एक छोटा सा बॉक्स प्लॉट कर सकता हूं। लेकिन महत्वहीन डेटा के लिए, मुझे बस एक पिक्सेल चाहिए। –

उत्तर

94

यह एक एकल पिक्सेल सेट हो जाएगा ।

बिटममैप गेट पिक्सेल और सेट पिक्सेल ऑपरेशंस विशेष रूप से तेज़ नहीं हैं क्योंकि वे बहुत अधिक बाउंडशेकिंग करते हैं, लेकिन 'फास्ट बिटमैप' क्लास बनाने में काफी आसान है, जिसमें बिटमैप तक त्वरित पहुंच है।

+8

किसने अनुमान लगाया होगा कि DrawRectangle 2x2 खींचता है लेकिन FillRectange एक ही तर्क के साथ 1x1 खींचता है? धन्यवाद। –

+8

@ मार्क: यह एक तरह का अर्थ बनाता है ...DrawRectangle कहता है "इस चौड़ाई और ऊंचाई के x और y से शुरू होने वाली रूपरेखा तैयार करें," इसलिए यह प्रारंभ और अंत बिंदु दोनों (x, y; x + 1, y; x, y + 1; x + 1, y + 1) और उनके बीच की रेखाएं। FillRectangle कहते हैं "इस चौड़ाई और ऊंचाई के एक्स, वाई पर शुरू एक ठोस सतह खींचें।" संयोग से, FillRectangle एक ब्रश नहीं, एक पेन नहीं लेता है। – Powerlord

+3

@ आर। Bemrose: असल में, यह आपके द्वारा 'DrawRectangle() 'तक पहुंचने वाली पेन ऑब्जेक्ट पर निर्भर करता है। यदि इसमें 'पेन। एलाइनमेंट = पेनलाइनिंग' आउटसेट है तो यह दिए गए आयत के चारों ओर 'पेन। विथथ' पिक्सेल मोटी रूपरेखा खींचा जाएगा। लेकिन अगर आप 'पेन। एलाइनमेंट = पेनलाइनिंग' इंसेट 'निर्दिष्ट करते हैं तो यह दिए गए आयताकार के अंदर पेन विड्थ पिक्सल मोटी "रूपरेखा" खींच जाएगा। – Cipi

16

Graphics वस्तु इस के बाद से यह एक अमूर्त है और एक वेक्टर ग्राफिक्स प्रारूप को कवर करने के लिए इस्तेमाल किया जा सकता है नहीं है,। उस संदर्भ में, एक पिक्सेल सेट करना समझ में नहीं आता है। Bitmap छवि प्रारूप में GetPixel() और SetPixel() है, लेकिन एक पर निर्मित ग्राफिक्स ऑब्जेक्ट नहीं है। आपके परिदृश्य के लिए, आपका विकल्प वास्तव में एकमात्र ऐसा लगता है क्योंकि सामान्य ग्राफिक्स ऑब्जेक्ट के लिए एकल पिक्सल सेट करने के लिए कोई भी आकार-फिट नहीं है (और आप बिल्कुल नहीं जानते कि यह आपके नियंत्रण/रूप के रूप में क्या है डबल-बफ़र, आदि हो सकता है)

क्यों आप एक ही पिक्सेल सेट करने के लिए की जरूरत है?

1

जाहिर DrawLine एक पंक्ति है कि वास्तविक निर्दिष्ट लंबाई में से एक पिक्सेल कम है छोड़ता है। ऐसा लगता है कि कोई ड्रॉपॉइंट/ड्रॉ पिक्सेल/व्हाट्नॉट नहीं है, लेकिन इसके बजाय आप एकल पिक्सल खींचने के लिए चौड़ाई और ऊंचाई के साथ DrawRectangle का उपयोग कर सकते हैं। मैं कहाँ (विभिन्न अनुकूलित डेटा डिस्प्ले के लिए) एक पिक्सल के बहुत सारे ड्राइंग हूँ

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

अच्छा प्रयास करें, लेकिन आकार 1 के साथ यह 2x2 पिक्सल खींचता है। (इसे एक पंक्ति के बगल में खींचें, और आप देख सकते हैं कि यह दो गुना चौड़ा है।) और आकार शून्य के साथ, निश्चित रूप से, यह कुछ भी नहीं खींचता है। –

+0

ठीक है, मेरी गलती। :) अच्छी बात FillRectangle चाल करता है। – Rytmis

+0

लेकिन ड्रॉलाइन कम खींचती है। – Joshua

8

, मैं Blit कि स्क्रीन पर तो एक बिटमैप करने के लिए उन्हें आकर्षित और के लिए करते हैं:

13

बस हेंक Holterman जवाब के लिए पूरा कोड को दिखाने के लिए:

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

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

MSDN Page on GetHdc

मुझे लगता है कि यह आपके लिए क्या देख रहे है। आपको एचडीसी प्राप्त करने और फिर SetPixel का उपयोग करने के लिए जीडीआई कॉल का उपयोग करने की आवश्यकता होगी। ध्यान दें, कि जीडीआई में एक रंग एक डीडब्ल्यूओआर एक बीजीआर रंग भंडारित है। कोई अल्फा चैनल नहीं है, और यह जीडीआई + की रंग संरचना की तरह आरजीबी नहीं है।

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); 
    } 
    ... 
} 
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); 
     } 
    } 
संबंधित मुद्दे