मेरी अपनी कक्षाएं हैं जो छवि डेटा का प्रतिनिधित्व करती हैं। उनके पास विभिन्न अंतर्निहित संरचना है लेकिन सभी में अनुक्रमित संपत्ति है जो 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 बहुत धीरे-धीरे काम करता है।
एक और विचार बिटमैप के पिक्सल को असाइन करने के लिए मार्शलिंग का उपयोग करना है, लेकिन ऑनपेंट इवेंट हैंडलर के अंदर बिटमैप बनाने का पूरा विचार काफी लंगड़ा लगता है।
क्या कोई सुझाव है कि मुझे अपना काम किस दिशा में जारी रखना चाहिए?
1 उत्तर
कस्टम नियंत्रण बनाना और ऑनपेंट विधि को ओवरराइड करना महत्वपूर्ण होगा यदि आप जिस डेटा को प्रदर्शित करना चाहते हैं वह किसी तरह से वेक्टरियल था। यदि आपके पास प्रदर्शित करने के लिए एक छवि है, तो बिटमैप ऑब्जेक्ट बनाने से बेहतर विकल्प नहीं लगता है।
मुझे पता है कि सेटपिक्सेल धीमा है और मुझे यकीन नहीं है कि 'बिटमैप के पिक्सल असाइन करने के लिए मार्शलिंग का उपयोग करें' के साथ आपका क्या मतलब है, लेकिन System.Drawing.Imaging.BitmapData
वर्ग और Bitmap.LockBits
विधि का उपयोग करके एक तेज़ विकल्प है। एक उदाहरण उपयोग यहां देखें।
वैसे, आपको ऑनपेंट विधि में बिटमैप ऑब्जेक्ट बनाने की आवश्यकता क्यों है? क्या इसे एक बार बनाना और असाइन करना पर्याप्त नहीं है?
संबंधित सवाल
नए सवाल
.net
.NET कोर के बारे में प्रश्नों के लिए उपयोग न करें - इसके बजाय [.net-core] का उपयोग करें। .NET फ्रेमवर्क मुख्य रूप से माइक्रोसॉफ्ट विंडोज ऑपरेटिंग सिस्टम के लिए डिज़ाइन किया गया एक सॉफ्टवेयर फ्रेमवर्क है। इसमें बेस क्लास लाइब्रेरी, कॉमन लैंग्वेज रनटाइम (आमतौर पर सीएलआर के रूप में संदर्भित), कॉमन टाइप सिस्टम (आमतौर पर सीटीएस के रूप में संदर्भित) और डायनेमिक भाषा रनटाइम का कार्यान्वयन शामिल है। यह C #, VB.NET, F # और C ++ / CLI सहित कई प्रोग्रामिंग भाषाओं का समर्थन करता है।