2010-08-25 23 views
7

मैं छवियों को जल्दी से एक चित्र बॉक्स में लोड करने और उन पर आकर्षित करने की कोशिश कर रहा हूं। जब मैं चित्र बॉक्स में बिटमैप असाइन करता हूं और जब यह दिखाई देता है, तो मेरे बीच एक 13 सेकंड की देरी होती है। और जब भी मैं picturebox.refresh() करता हूं, तो यह पेंट विधि कहने से पहले .13 - .15 सेकंड की एक ही देरी है। क्या इस देरी से छुटकारा पाने का कोई तरीका है?चित्र चित्र बॉक्स को तेजी से प्रदर्शित करें

मैं विजुअल स्टूडियो 2010 में सी # का उपयोग कर रहा हूं। मैं फ्रीइमेज लाइब्रेरी का उपयोग कर छवियों को लोड करता हूं।

if (IsMouseDown || DrawLine.Checked || IsMovingBox) 
{ 
    Tracing.Trace("Update Picture Box"); 
    pictureBox.Refresh(); 
} 

तब मैं जब मेरे रंग घटना कहा जाता है एक लाइन की तलाश करती:

यहाँ मेरी pictureBox_MouseMove घटना में कोड है। देरी दो ट्रेस लाइनों के बीच है।

यदि मैं 117kb पर बिटोनल टिफ़ छवि का उपयोग करता हूं तो देरी होती है .13 सेकंड। स्मृति में इस छवि को लोड करने के लिए .04 सेकंड लगते हैं। इस बिटमैप के साथ मेरे पिक्चरबॉक्स बिटमैप को प्रतिस्थापित करने के लिए .01 सेकंड लगते हैं।

यदि मैं 1125kb पर ग्रे ग्रे स्केल jpg छवि का उपयोग करता हूं तो देरी होती है .14 सेकंड। स्मृति में इस छवि को लोड करने के लिए .26 सेकंड लेता है। इस बिटमैप के साथ मेरे पिक्चरबॉक्स बिटमैप को प्रतिस्थापित करने के लिए .03 सेकेंड लगते हैं।

उत्तर

11

मान लिया जाये कि अपने कोड में कोई अन्य देरी उस संदेश पाश फिर से प्रवेश करने से यूआई धागा रोका जा सके देखते हैं ताकि OnPaint() विधि कहा जा सकता है: अपने पेंट ईवेंट हैंडलर कहा जाता हो जाता है के बाद PictureBox आकर्षित किया है छवि। यह अभी तक दिखाई नहीं दे रहा है, पीबी डबल-बफरिंग का उपयोग करता है।

पीबी के ग्राहक क्षेत्र में फिट होने के लिए इसे आकार देने के लिए उस छवि को आकर्षित करने के लिए महंगा हो जाता है। जो आपके मामले में बहुत अधिक संभावना है क्योंकि आपकी छवियां बहुत बड़ी हैं। आकार बदलने वाली छवि को अच्छे बनाने के लिए यह एक उच्च-गुणवत्ता वाले द्वि-क्यूबिक फ़िल्टर का उपयोग करता है। यह बहुत महंगा है, यद्यपि परिणाम अच्छा है।

उस व्यय से बचने के लिए, छवि संपत्ति को सौंपने से पहले छवि का आकार बदलें। इसे पीबी के क्लाइंटसाइज के जितना बड़ा बनाएं।

यह स्वयं में एक बड़ा अंतर बनाने जा रहा है। अगली चीज़ जो आप कर सकते हैं वह है 32bppPArgb पिक्सेल प्रारूप के साथ स्केल्ड बिटमैप बनाना। यह प्रारूप है जो किसी भी अन्य के बाद लगभग 10 गुना तेज है क्योंकि यह अधिकांश मशीनों पर वीडियो एडाप्टर से मेल खाता है, इसलिए कोई पिक्सेल प्रारूप रूपांतरण आवश्यक नहीं है।

कुछ कोड:

private void loadImage(string path) { 
     using (var srce = new Bitmap(path)) { 
      var dest = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 
      using (var gr = Graphics.FromImage(dest)) { 
       gr.DrawImage(srce, new Rectangle(Point.Empty, dest.Size)); 
      } 
      if (pictureBox1.Image != null) pictureBox1.Dispose(); 
      pictureBox1.Image = dest; 
     } 
    } 

आप शायद इस के साथ टिंकर चाहता हूँ ताकि छवि अपने पक्ष अनुपात संरक्षित रखे। यह सुनिश्चित करने के लिए पहले कि आप perf सुधार प्राप्त करें, इसे आजमाएं।

+0

हंस, यह हो सकता है! प्रारंभिक परीक्षण निश्चित रूप से बेहतर हैं! इसे मेरे कोड में फ़िट करना और पहलू अनुपात को सही ढंग से सेट करना ... – Mark

+0

हंस, यह सही था! बहुत अच्छा! धन्यवाद! – Mark

संबंधित मुद्दे