2010-08-24 8 views
6

मैं एक बहुत बड़ी छवि (14473x25684) लोड करने की कोशिश कर रहा हूं, लेकिन मैं स्मृति सीमा में मार रहा हूं।OutofMemoryException - बेहद बड़ी छवियां लोड हो रही हैं

यहाँ समस्या प्रदर्शित करने के लिए एक साधारण प्रोग्राम है:

static void Main(string[] args) 
{ 
    string largeimage = @"C:\Temp\test_image.jpg"; // 14473x25684 

    Image i = Bitmap.FromFile(largeimage); // OutofMemoryException was unhandled 
} 

अब मैं समझता हूँ कि इस मुद्दे को कितना भौतिक स्मृति मेरे पास करने के लिए प्रासंगिक नहीं है, बल्कि एक को संबोधित कर रहे सीमा है। क्या इस सीमा को पाने के लिए मैं कुछ भी कर सकता हूं?

छवि वास्तव में मान्य है और यह फ़ोटोशॉप (वीएम आकार: 916 एमबी) और एसीडीएसई में ठीक खुलती है। Google को आयामों से भी परेशान न करें क्योंकि सूचीबद्ध आयाम सटीक नहीं हैं। :)

आपके समय के लिए धन्यवाद।

+0

मैंने पहले इसमें भाग लिया है। जो मैं कह सकता हूं उससे यह ढांचा ढांचा है। –

+0

वाह। यह एक बड़ी तस्वीर है। दुर्भाग्य से, फ्रेमवर्क बिटमैप कक्षा आपकी आवश्यकताओं को कवर नहीं करेगी। आप पाते हैं कि एक चंकित दृष्टिकोण लेना, जहां आप बिटमैप हेडर को मार्शल करते हैं और पिक्सेल को अधिक प्रबंधनीय छवि आयाम में नमूना देते हैं, वह आपकी सबसे अच्छी शर्त है। हालांकि यह एक चुनौती है, क्योंकि इसमें थोड़ा सा पहिया-पुनर्निर्माण शामिल है। मुझे आश्चर्य होगा अगर फ़ोटोशॉप और एसीडीएसई पूरी असम्पीडित छवि को स्मृति में लोड करते हैं। – kbrimington

उत्तर

4

बिटमैप वर्ग स्मृति की 1.5GB के आसपास की आवश्यकता होगी कि उदाहरण धारण करने के लिए। .NET स्मृति आवंटक आमतौर पर 1 जीबी चिह्न के आसपास चोक करता है।

0

ओएस स्मृति की संगत राशि आवंटित नहीं कर सकता है। आप इसके बारे में MemoryFailPoint का उपयोग कर सकते हैं और अपर्याप्त मैमरी अपवाद पकड़ सकते हैं। लेकिन यह केवल आपको ऐप क्रैशिंग से बचाता है।
मेरे लिए, इस तरह की एक बड़ी फ़ाइल खोलने के लिए आपको बाइनरी रीडर का उपयोग करना चाहिए और सिस्टम के माध्यम से फ़ाइल खींचना चाहिए। ड्रॉइंग।

यहाँ अच्छा सवाल है और जवाब देता When is it OK to catch an OutOfMemoryException and how to handle it?

+0

ओएस यह कर सकता है (यदि यह 64-बिट ओएस है), लेकिन .NET फ्रेमवर्क नहीं हो सकता है (भले ही यह 64 बिट्स हो)। –