विंडोज फॉर्म पर एक सिंगल पिक्सेल ड्रा करें


93

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

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

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

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

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


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

मेरे द्वारा देखे गए सभी जवाबों से ऐसा लगता है जैसे वे वास्तव में एक ही पिक्सेल के लिए ओवरकिल हैं? केवल एक बफर [y * चौड़ाई + x] = रंग करना आसान क्यों लगता है;
NoMoreZealots

जवाबों:


114

यह एक एकल पिक्सेल सेट करेगा:

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

18
किसने अनुमान लगाया होगा कि ड्रा रेक्टेंगल एक 2x2 खींचता है लेकिन फिलरक्टैन्ज 1x1 को एक ही तर्क के साथ आकर्षित करता है? धन्यवाद।
मार्क टी

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

5
@R। बेमरोज: ​​दरअसल, यह उस पेन ऑब्जेक्ट पर निर्भर करता है जिसे आप पास करते हैं DrawRectangle()। यदि यह है तो यह दी गई आयत के चारों Pen.Alignment = PenAlignment.Outsetओर Pen.Widthपिक्सेल मोटी रूपरेखा तैयार करेगा । लेकिन यदि आप निर्दिष्ट करते हैं Pen.Alignment = PenAlignment.Insetकि यह दिए गए आयत के अंदर पेन। विथ पिक्सल मोटी "रूपरेखा" को आकर्षित करेगा।
सिफी

2
यह बहुत असंतोषजनक उत्तर है। हालांकि यह एक एकल पिक्सेल सेट करता है, आवश्यकता हमेशा शाब्दिक पिक्सेल सेट करने की नहीं होती है। हर समय मुझे इसकी आवश्यकता होती है, जो अक्सर होता है, मुझे उसी पेन द्वारा खींची जाने वाली डॉट की आवश्यकता होती है जो लाइनों के साथ खींची जाती है, ब्रश नहीं। दूसरे शब्दों में, हमें एक पंक्ति की आवश्यकता है जो कि 2 पिक्सेल से कम हो। मुझे संदेह है कि ओपी को क्या चाहिए।
राबर्ट टीटी

6
मुझे यह उत्तर पसंद नहीं है। यह तरीका बेहद अक्षम है।
user626528

19

हेनक होल्टरमैन जवाब के लिए बस पूरा कोड दिखाने के लिए:

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 पेज

मुझे लगता है कि तुम इसे खोज रहे हो। आपको एचडीपीसी प्राप्त करने की आवश्यकता होगी और फिर सेटपिक्सल का उपयोग करने के लिए जीडीआई कॉल का उपयोग करना होगा। ध्यान दें, GDI में एक COLORREF एक BORD रंग जमा करने वाला DWORD है। कोई अल्फा चैनल नहीं है, और यह GDI + के कलर स्ट्रक्चर की तरह 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

जाहिरा तौर पर ड्रालाइन एक रेखा खींचती है जो वास्तविक निर्दिष्ट लंबाई का एक पिक्सेल कम है। वहाँ एक DrawPoint / DrawPixel / whatnot प्रतीत नहीं होता है, लेकिन इसके बजाय आप किसी एकल पिक्सेल को ड्रा करने के लिए 1 से 1 की चौड़ाई और ऊंचाई के साथ DrawRectangle का उपयोग कर सकते हैं।


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

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

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);
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.