2010-09-14 10 views
7

से 'स्ट्राइड' की समस्याएं मेरे पास 2208 x 3000 ट्रांसफॉर्मेड बिटमैप ऑब्जेक्ट प्रारूप {इंडेक्सड 8} है जो मैं कर रहा हूं। कॉपीपीक्सल्स() चालू। मैंएक ट्रांसफॉर्मेड बिटमैप ऑब्जेक्ट

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7)/8) 

उपयोग कर रहा हूँ मेरी विधि कॉल में 'छलांग' मान और बाइट्स की एक सरणी है जिसके लिए ('formattedBitmap' मानते हुए छवि जहाँ से मैं पिक्सल कॉपी करने के लिए कोशिश कर रहा हूँ का नाम है) लंबाई में 2208। मेरे पास कोड में कहीं और काम करने जैसा कुछ है (जहां छवि का प्रारूप {ग्रे 8} है। हालांकि, जहां मैं उपरोक्त छवि पर वही काम करने की कोशिश कर रहा हूं, मुझे लगातार "तर्क से बाहर तर्क" मिलता है अपवाद कह रहा है "पैरामीटर मान '6624000' से कम नहीं हो सकता है। \ r \ n पैरामीटर नाम: बफर।"

इस बारे में मेरे प्रश्न हैं: क्यों दुनिया में एक ही कोड एक ही स्थान पर काम करता है और नहीं दूसरा? दुनिया में क्या, आम आदमी के शब्दों में, वास्तव में 'घुमावदार' है? और मैं इस त्रुटि के बिना वांछित प्रभाव (बिट्स की प्रतिलिपि बनाने) कैसे प्राप्त कर सकता हूं? मैं गलत क्या कर रहा हूं?

कोई मदद इसके लिए बहुत सराहना की जाएगी। बहुत बहुत धन्यवाद!

उत्तर

9

मैंने यह पता लगाया है (वाह ... थोड़े विश्वास नहीं कर सकते कि मैंने कुछ घंटों के साथ गड़बड़ कर बिताई!)। समस्या यह है कि बाइट सरणी आकार

sourceImage.PixelHeight * stride 

का हो गया है था, जहां

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7)/8); 

कारण यह है कि यह मेरे कोड में अन्य स्थान में काम किया क्योंकि बल्कि पूरी छवि के लिए पिक्सल प्रति बनाने की बजाय है (जैसा कि मैं ऐसा करने की कोशिश कर रहा हूं जहां मुझे समस्या थी), मैं केवल एक पंक्ति के पिक्सेल की प्रतिलिपि बना रहा था ... यानी मूल रूप से 2008 x 1 क्षेत्र है, ताकि गंतव्य बाइट सरणी का आकार हो सके बिल्कुल 2208 और यह ठीक काम करेगा। भविष्य के संदर्भ के लिए, ऐसा कुछ शायद हमेशा, कम या कम होना चाहिए,

int width = source.PixelWidth; 
int height = source.PixelHeight; 
int stride = width * ((source.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 

source.CopyPixels(bits, stride, 0); 

चीयर्स!

+4

ओह, और एमएसडीएन का 'सुंदर' क्या है पर एक सुंदर सभ्य लेख है। यह निश्चित रूप से "आम आदमी" शब्द नहीं है और मुझे वास्तव में थोड़ा सा दोषी पाया जाता है, लेकिन यह एक अच्छा संदर्भ नहीं है (कम से कम एक को आपको वास्तव में समझने के लिए कई बार पढ़ने की आवश्यकता हो सकती है यदि आप सी # में छवि प्रसंस्करण के लिए नए हैं (जैसा कि मैं हूं!)) लिंक: http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx – JToland

+0

एक ऐसे व्यक्ति के रूप में जो कोड पर नज़र डालता है (हम सब जल्दी में हैं ठीक है?) मैंने आपकी तरफ की गणना (गलत एक) देखा और आधे घंटे बिताए और यह महसूस करने से पहले कि आप सही फॉर्मूला को आगे बढ़ाएंगे। शीर्ष पर सही सूत्र होना अच्छा लगेगा :) – Peter

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