2009-05-07 16 views
5

मुझे किसी दिए गए निर्देशिका में छवियों के थंबनेल प्रदर्शित करने की आवश्यकता है। छवि को छवि घटक में लोड करने से पहले मैं छवि फ़ाइल को पढ़ने के लिए TFileStream का उपयोग करता हूं। बिटमैप को तब थंबनेल आकार में बदल दिया जाता है, और टीएसक्रॉलबॉक्स पर एक टीआईमेज घटक को आवंटित किया जाता है।किसी छवि को लोड करने और पुनः आकार देने का सबसे तेज़ तरीका क्या है?

ऐसा लगता है कि यह ठीक काम करता है, लेकिन बड़ी छवियों के साथ बहुत धीमा हो जाता है।

क्या डिस्क से लोडिंग (छवि) फ़ाइलों का एक तेज़ तरीका है और उनका आकार बदल रहा है?

धन्यवाद, पीटर

उत्तर

5

वास्तव में नहीं। आप पृष्ठभूमि थ्रेड में उनका आकार बदल सकते हैं, और आकार बदलने तक "प्लेस धारक" छवि का उपयोग कर सकते हैं। इसके बाद मैं बाद में प्रसंस्करण के लिए इन आकार की छवियों को किसी प्रकार की कैश फ़ाइल में सहेज दूंगा (विंडोज़ यह करता है, और वर्तमान निर्देशिका में कैश thumbs.db को कॉल करता है)।

आपके पास थ्रेड आर्किटेक्चर पर कई विकल्प हैं। एक एकल थ्रेड जो सभी छवियों, या थ्रेड पूल करता है जहां थ्रेड केवल एक छवि को संसाधित करने के बारे में जानता है। AsyncCalls लाइब्रेरी एक और तरीका है और चीजों को काफी सरल रख सकता है।

+0

मेरा ऐप अब प्लेसहोल्डर और धागे (स्काम्रेड, मागी) का उपयोग करता है और यह पूरी तरह से काम करता है।Stijn Sanders द्वारा सुझाए गए थंबनेल निकाले जाते हैं। धन्यवाद। पीटर। –

+0

दुर्भाग्यवश, AsyncCalls मर चुका है (बंद)। – Ampere

5

मैं इसे यथासंभव तेज़ी से डिजाइन करने के प्रयास के साथ स्काम्रेड द्वारा उत्तर का पूरक करूंगा। इसके लिए आपको

  • अनुकूलन आई/ओ
  • उपयोग एक से अधिक थ्रेड कई सीपीयू कोर का उपयोग करना चाहिए, और एक भी सीपीयू कोर काम करते हुए आप पढ़ सकते हैं रखने के लिए (या लिखना) फ़ाइलें

एकाधिक धागे का उपयोग यह दर्शाता है कि आकार बदलने के लिए वीसीएल कक्षाओं का उपयोग करने के लिए काम नहीं किया जा रहा है, क्योंकि वीसीएल थ्रेड-सुरक्षित नहीं है, और इसके आसपास के सभी हैक्स अच्छी तरह से स्केल नहीं करते हैं। efg's Computer Lab में छवि प्रसंस्करण कोड के लिए लिंक हैं।

एकाधिक धागे का उपयोग करते समय कई समवर्ती I/O संचालन का कारण नहीं होना महत्वपूर्ण है। यदि आप थंबनेल छवियों को फ़ाइलों पर वापस लिखना चुनते हैं, तो एक बार जब आप फ़ाइल पढ़ना शुरू कर देते हैं तो आपको इसे पूरी तरह से पढ़ना चाहिए, और एक बार जब आप एक फाइल लिखना शुरू कर देते हैं तो आपको इसे पूरी तरह से लिखना चाहिए। दोनों परिचालनों को अंतःस्थापित करने से आपके आई/ओ को मार दिया जाएगा, क्योंकि आप संभावित रूप से हार्ड डिस्क हेड के बहुत से परिचालनों का संचालन कर सकते हैं।

सर्वोत्तम परिणामों के लिए फ़ाइलों के पढ़ने (और लेखन) को आपके आवेदन के मुख्य (जीयूआई) थ्रेड में भी नहीं होना चाहिए।

  • एक धागा TGraphic वस्तुओं में फ़ाइलों को पढ़ने के है, और एक धागा सुरक्षित सूची में इन डाल: यह निम्नलिखित डिजाइन सुझाव है।
  • मूल आकार में फ़ाइलों की सूची पर एक थ्रेड पूल प्रतीक्षा करें, और एक थ्रेड प्रक्रिया एक टीजीआरपीसी ऑब्जेक्ट है, इसे किसी अन्य टीजीआरपीसी ऑब्जेक्ट में आकार दें, और इसे किसी अन्य थ्रेड-सुरक्षित सूची में जोड़ें।
  • सूची में जोड़े गए प्रत्येक थंबनेल छवि के लिए जीयूआई थ्रेड को सूचित करें, इसलिए इसे प्रदर्शित किया जा सकता है।
  • यदि फ़ाइल में थंबनेल लिखे जाने हैं, तो इसे रीडिंग थ्रेड में भी करें (स्पष्टीकरण के लिए ऊपर देखें)।

संपादित करें:

पर फिर से पढ़ने आपके सवाल का मैं ध्यान दें कि आप शायद केवल एक छवि है, इस स्थिति में एक भी पृष्ठभूमि धागा पर्याप्त निश्चित रूप से है आकार बदलना होगा। मैं वैसे भी अपना जवाब छोड़ दूंगा, शायद यह किसी और के लिए कुछ समय का उपयोग होगा। मैंने अपनी नवीनतम परियोजनाओं में से एक से यह सीखा है, जहां अंतिम कार्यक्रम को थोड़ी अधिक गति की आवश्यकता हो सकती थी, लेकिन चोटी के समय में केवल 75% क्वाड कोर मशीन का उपयोग कर रही थी। प्रसंस्करण से I/O decoupling अंतर बना दिया होगा।

5

मैं अक्सर स्केल के साथ TJPEGImage का उपयोग करता हूं: = jsEighth (डेल्फी 7 में)। यह वास्तव में तेज़ है क्योंकि जेपीईजी डी-संपीड़न केवल आठवीं चौड़ाई और ऊंचाई के बिटमैप को भरने के लिए बहुत सारे डेटा को छोड़ सकता है।

एक अन्य विकल्प shell's method to extract a thumbnail है, जो बहुत तेजी से और साथ ही

+0

यह अच्छा लग रहा है। मैं पिछले साल इसे समझने के लिए बेताब था लेकिन अब मैं ज्यादा परवाह नहीं करता हूं। लेकिन मैं अभी भी अपने कुछ ऐप्स को TJPEGImage.Scale दृष्टिकोण का उपयोग कर ठीक कर सकता हूं। धन्यवाद –

1

मैं दृष्टि व्यापार में हूँ उपयोग करने के लिए है, और मैं बस GPU ओपन का उपयोग करने के लिए छवियों को अपलोड। (आमतौर पर 20x 2048x2000x8bpp प्रति सेकेंड), एक बनावट प्रति बीएमपी, और वीडियोकार्ड स्केल (win32, माइक लिस्के के ओपनगल हेडर)

सटीक वीडियोकार्ड के आधार पर ऐसी छवि लागत 5-10ms अपलोड करें (अगर एकीकृत नहीं है और nvidia 7300 श्रृंखला या नए। हाल ही में एकीकृत जीपीयू भी करने योग्य हो सकते हैं)। स्केलिंग और लागत 300us प्रदर्शित करना। जिसका अर्थ है कि ऐप को छूए बिना ग्राहक पागल की तरह पैन और ज़ूम कर सकते हैं। मैं इसके ऊपर एक ओवरले (जो एक टमाटरफाइल होता था लेकिन अब एक प्रारूप है) खींचता है।

मेरी सबसे बड़ी तस्वीर 4096x7000x8bpp है जो 30ms से कम में दिखाती है और स्केल करती है। (जीएफ 8600)

इस तकनीक की एक सीमा अधिकतम बनावट आकार है। इसे चित्र को कई बनावट में विभाजित करके हल किया जा सकता है, लेकिन मुझे अभी तक परेशान नहीं है क्योंकि मैं सॉफ़्टवेयर के साथ सिस्टम वितरित करता हूं।

(कुछ विशिष्ट आकारों: nv6x00 श्रृंखला: 2k * 2k लेकिन अपलोड करने के बारे में भी GDI nv7x00 श्रृंखला की तुलना में विराम होता:। 8k: 4k * 4k मेरे लिए आधारभूत कार्ड GF7300 के $ 20-40 nv8x00 श्रृंखला की तरह हैं * 8k )

ध्यान दें कि यह सभी के लिए नहीं हो सकता है। लेकिन यदि आप हार्डवेयर सीमा निर्दिष्ट करने के लिए भाग्यशाली स्थिति में हैं, तो यह काम कर सकता है। मुख्य समस्या थिंकपैड जैसे लैपटॉप हैं, जिनमें से जीपीयू औसत लैपटॉप से ​​पुराने हैं, जो बदले में अक्सर डेस्कटॉप के पीछे एक पीढ़ी होती है।

मैंने डायरेक्टएक्स पर ओपनजीएल चुना क्योंकि यह समय में अधिक स्थिर है, और गैर-गेम संबंधित उदाहरणों को ढूंढना आसान है।

+0

बहुत जानकारीपूर्ण लेकिन ऑफ-विषय। –

+0

मुझे यह पता चला कि मैं क्या देख रहा था। धन्यवाद! –

0

थंबनेल बनाने के लिए विंडोज़ क्षमता की खोज करें। याद रखें कि उन छवियों में छिपी हुई Thumbs.db फ़ाइलें जिनमें छवियां हैं?

मैंने इस सुविधा की तरह कुछ लागू किया है लेकिन वीबी में। मेरा सॉफ्टवेयर लगभग 10 सेकंड में 100 फाइलों (मिश्रित आकार) के थंबनेल बनाने में सक्षम है।

हालांकि मैं इसे डेल्फी में परिवर्तित करने में सक्षम नहीं हूं।

0

Graphics32 library को देखने का प्रयास करें: यह चीजों को चित्रित करने में बहुत अच्छा है और बिट बिटमैप्स के साथ काम करता है। वे थ्रेड हैं - अच्छे उदाहरण के साथ सुरक्षित, और यह पूरी तरह से नि: शुल्क है।

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

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