मेरी अपनी कक्षाएं हैं जो छवि डेटा का प्रतिनिधित्व करती हैं। उनके पास विभिन्न अंतर्निहित संरचना है लेकिन सभी में अनुक्रमित संपत्ति है जो i, j-th छवि तत्व लौटाती है। मुझे ऐसी छवियों को एक रूप में प्रदर्शित करने की आवश्यकता है। अभी मैं उन्हें System.Drawing.Bitmap में पूर्व-रूपांतरित करता हूं और फिर इसे एक मानक Winforms PictureBox में प्रदर्शित करता हूं। मेरा विचार एक कस्टम नियंत्रण बनाना है जिसमें मेरी छवि प्रकार की संपत्ति होगी और इसे System.Drawing.Bitmap या System.Drawing.Image में प्रारंभिक रूप से परिवर्तित किए बिना एक चित्र प्रदर्शित करेगा।

मेरा सुझाव है कि इस समस्या का सुराग उपयोगकर्ता द्वारा तैयार नियंत्रण बना रहा है और वहां ऑनपेंट घटना को ओवरराइड कर रहा है।

protected override void  OnPaint(PaintEventArgs e)
    {
        for(int i=e.ClipRectangle.Left; i<=e.ClipRectangle.Right; i++)
        {
            for (int j = e.ClipRectangle.Top; j <= e.ClipRectangle.Bottom; j++)
            {
                //do something with i and j here
                //calculate the corresponding k and l indices
                //assign _myCustomClassImage[k,l] somewhere
            }
        }

    }

हां, मैं समझता हूं कि मैं क्लिप आयत के आकार का बिटमैप बना सकता हूं और इसके तत्वों को असाइन करने के लिए SetPixel का उपयोग कर सकता हूं लेकिन SetPixel बहुत धीरे-धीरे काम करता है।

एक और विचार बिटमैप के पिक्सल को असाइन करने के लिए मार्शलिंग का उपयोग करना है, लेकिन ऑनपेंट इवेंट हैंडलर के अंदर बिटमैप बनाने का पूरा विचार काफी लंगड़ा लगता है।

क्या कोई सुझाव है कि मुझे अपना काम किस दिशा में जारी रखना चाहिए?

0
Nu-hin 17 अक्टूबर 2011, 17:53

1 उत्तर

सबसे बढ़िया उत्तर

कस्टम नियंत्रण बनाना और ऑनपेंट विधि को ओवरराइड करना महत्वपूर्ण होगा यदि आप जिस डेटा को प्रदर्शित करना चाहते हैं वह किसी तरह से वेक्टरियल था। यदि आपके पास प्रदर्शित करने के लिए एक छवि है, तो बिटमैप ऑब्जेक्ट बनाने से बेहतर विकल्प नहीं लगता है।

मुझे पता है कि सेटपिक्सेल धीमा है और मुझे यकीन नहीं है कि 'बिटमैप के पिक्सल असाइन करने के लिए मार्शलिंग का उपयोग करें' के साथ आपका क्या मतलब है, लेकिन System.Drawing.Imaging.BitmapData वर्ग और Bitmap.LockBits विधि का उपयोग करके एक तेज़ विकल्प है। एक उदाहरण उपयोग यहां देखें।

वैसे, आपको ऑनपेंट विधि में बिटमैप ऑब्जेक्ट बनाने की आवश्यकता क्यों है? क्या इसे एक बार बनाना और असाइन करना पर्याप्त नहीं है?

1
tafa 17 अक्टूबर 2011, 18:18
हां, मेरा मतलब बिल्कुल बिटमैपडाटा के साथ था। आप एक प्रबंधित सरणी को बिटमैपडेटा में कॉपी करने के लिए System.Runtime.InteropServices.Marshal.Copy विधि का उपयोग कर सकते हैं।
 – 
Nu-hin
18 अक्टूबर 2011, 01:44
हां, एक बार बिटमैप बनाना और असाइन करना पर्याप्त है, लेकिन मैं जो चाहता था वह बिटमैप बनाने से बचना था। मेरे डेटा को बिटमैप में कॉपी करना और फिर इसे ड्रा करने के लिए उपयोग करना एक बेमानी समाधान की तरह लग रहा था।
 – 
Nu-hin
18 अक्टूबर 2011, 01:50