2013-10-31 11 views
7

का उपयोग कर स्मृति से बनाई गई बिटमैप जेडीआई + बिटमैप को सहेजते समय सामान्य त्रुटि एसओ और वेब पर मेरे शोध के अनुसार स्पष्ट रूप से एक आम समस्या है। निम्न सरलीकृत स्निपेट को देखते हुए:जीडीआई + जेनेरिक त्रुटि बचत लॉकबिट

byte[] bytes = new byte[2048 * 2048 * 2]; 

for (int i = 0; i < bytes.Length; i++) 
{ 
    // set random or constant pixel data, whatever you want 
} 

Bitmap bmp = new Bitmap(2048, 2048, PixelFormat.Format16bppGrayScale); 
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, 2048, 2048), ImageLockMode.ReadWrite, bmp.PixelFormat); 
System.Runtime.InteropServices.Marshal.Copy(bytes, 0, bmpData.Scan0, 8388608); 
bmp.UnlockBits(bmpData); 
bmp.Save(@"name.bmp"); 

परिणामस्वरूप 0x80004005 जेनेरिक त्रुटि होती है। इसके लिए सामान्य कारण घटकों पर ताले कहा जाता है, लेकिन मुझे यहां कुछ भी नहीं दिख रहा है। क्या मैं सिर्फ अंधा हूं? जिस मार्ग को मैं सहेज रहा हूं, वह निश्चित रूप से मौजूद है, केवल खाली बीएमपी फ़ाइल बनाई गई है (0 बी)।

पृष्ठभूमि: मुझे कैमरे के ड्राइवर से पिक्सेल डेटा मिल रहा है जिसे मैं एक सी ++/सीएलआई रैपर का उपयोग करके .NET में स्थानांतरित कर रहा हूं, इसलिए उपरोक्त बिटमैप ऑब्जेक्ट को फ़ंक्शन कॉल द्वारा वापस किया जाता है। लेकिन चूंकि यह छोटा उदाहरण पहले से विफल रहता है, मुझे लगता है कि एडाप्टर में कुछ भी गलत नहीं है।

किसी भी सुझाव की अत्यधिक सराहना की जाती है!

+0

16-बिट ग्रेस्केल शायद वैध बीएमपी प्रारूप नहीं है? –

+0

मैंने ईमानदार होने के लिए इसे नहीं माना है। अनुक्रमित 8bpp पर स्विच करने से फ़ाइल को किसी भी त्रुटि के बिना बनाया गया। अंतिम लक्ष्य ग्रेस्केल 16 बीपीपी छवि को पीएनजी के रूप में सहेजना है, लेकिन उपरोक्त को 'bmp.Save (@" name.bmp ", ImageFormat.Png) से बदलना;' या तो काम नहीं किया। – simd

+0

क्या आपने सहेजते समय ImageFormat.Bmp निर्दिष्ट करने का प्रयास किया है? यह उत्तर देखें: http://social.msdn.microsoft.com/Forums/vstudio/en-US/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab/action?threadDisplayName=writing-a-16bit-grayscale-image – Ben

उत्तर

15
Bitmap bmp = new Bitmap(2048, 2048, PixelFormat.Format16bppGrayScale); 

जीडीआई + अपवाद खराब हैं, आपको दो गलतियों का निदान करने की बहुत कम उम्मीद होगी। जितना कम आपका सेव() कॉल है, यह उस छविफॉर्मैट को निर्दिष्ट नहीं करता है जिसे आप सहेजना चाहते हैं। डिफ़ॉल्ट रूप से पीएनजी है, बीएमपी नहीं, जैसा कि आपने आशा की थी।

लेकिन मुख्य एक पिक्सेलफॉर्मैट है। Format16bppGrayScale। जब जीडीआई + डिजाइन किया गया था, एनईटी के आसपास आने से बहुत पहले, हर कोई एलसीडी मॉनीटर के बजाय सीआरटी का उपयोग कर रहा था। रंगों का एक टुकड़ा प्रदर्शित करने में सीआरटी काफी अच्छे थे। हालांकि अच्छा, अभी तक कोई मुख्यधारा सीआरटी नहीं था जो 65536 अलग ग्रे रंग प्रदर्शित करने में सक्षम थे। अधिकांश वीडियो एडाप्टर में डीएसी द्वारा प्रतिबंधित, चिप जो डिजिटल पिक्सेल मान को सीआरटी के लिए एनालॉग सिग्नल में परिवर्तित करता है। एक डीएसी जो 16 मेगाहर्ट्ज सटीकता के साथ 100 मेगाहट्र्ज या उससे अधिक पर परिवर्तित कर सकती है वह अभी तक तकनीकी रूप से व्यवहार्य नहीं है। माइक्रोसॉफ्ट ने डिस्प्ले टेक्नोलॉजी पर जुआ सुधारने में सुधार किया ताकि किसी दिन संभवतः प्रारूप 16bppGrayScale को एक पिक्सेल प्रारूप के रूप में निर्दिष्ट किया जा सके जो किसी दिन उपलब्ध हो।

ऐसा नहीं हुआ। इसके विपरीत, एलसीडी रंग संकल्प पर काफी खराब हैं। विशिष्ट एलसीडी पैनल केवल पिक्सेल प्रारूप से उपलब्ध 8 बिट्स के बजाय रंग के 6 बिट को हल कर सकते हैं। 16-बिट रंग संकल्प को प्राप्त करने के लिए एक महत्वपूर्ण तकनीकी ब्रेक-थ्रू की आवश्यकता होगी।

इसलिए उन्होंने गलत अनुमान लगाया और चूंकि पिक्सेल प्रारूप उपयोगी नहीं है, इसलिए जीडीआई + में वास्तव में एक छवि एन्कोडर नहीं है जो 16bpp ग्रेस्केल छवि प्रारूप लिख सकता है। जब आप इसे चुनने वाले ImageFormat की परवाह किए बिना डिस्क पर सहेजने का प्रयास करते हैं तो Kaboom।

16bpp ग्रेस्केल वास्तव में उपयोग किया जाता है, रेडियोलॉजिकल इमेजिंग उस पिक्सेल प्रारूप का उपयोग करती है। वास्तव में उपयोगी बनाने के लिए बहुत महंगा प्रदर्शन के साथ। ऐसे उपकरण हालांकि अनावश्यक एक कस्टम छवि प्रारूप का उपयोग करते हैं, इसके साथ जाने के लिए, डीआईसीओएम सामान्य विकल्प है। जीडीआई + के लिए एक कोडेक नहीं है।

आपको उस पुस्तकालय के लिए खरीदारी करने की आवश्यकता होगी जो आपके ग्राहक द्वारा इच्छित छवि प्रारूप का समर्थन करता है। लीड टूल्स उस उत्पाद खंड में हजार पाउंड गोरिल्ला है।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद, स्पष्टीकरण के साथ कुछ पृष्ठभूमि प्राप्त करना हमेशा अच्छा होता है। यहां बिंदु यह है कि छवियों को प्रदर्शन के लिए कम उपयोग किया जाता है, लेकिन बाद में सॉफ्टवेयर द्वारा विश्लेषण। छवियां समय-चूक माइक्रोस्कोपी से हैं और 16 बिट हमें 8 बिट से अधिक विकल्प दे रही हैं। तो अगर मुझे अतिरिक्त lib के साथ जाना है, तो क्या WIC यहां काम करेगा (पहले से ही कैमरा एडाप्टर में इसके खिलाफ लिंक कर रहा है), या मुझे libpng पर वापस आना होगा? – simd

+3

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

+1

16 बिट बिटमैप्स रेंज डेटा के लिए भी उपयोगी हैं (जैसे किनेक्ट द्वारा उत्पन्न, उदाहरण के लिए) – Eponymous

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