2014-10-02 10 views
5

मेरे पास आरजीबी 8 प्रारूप में कैमरे से कच्चे पिक्सेल डेटा आ रहा है जिसे मुझे Bitmap में परिवर्तित करने की आवश्यकता है। हालांकि, Bitmap PixelFormat केवल आरजीबी 16, 24, 32, और 48 प्रारूपों का समर्थन करता है।आरजीबी 8 बाइट कनवर्ट करें [] से बिटमैप

मैंने PixelFormat.Format8bppIndexed का उपयोग करने का प्रयास किया, लेकिन छवि विकृत और उलटी हुई दिखाई देती है।

public static Bitmap CopyDataToBitmap(byte[] data) 
{ 
    var bmp = new Bitmap(640, 480, PixelFormat.Format8bppIndexed); 

    var bmpData = bmp.LockBits(
         new Rectangle(0, 0, bmp.Width, bmp.Height), 
         ImageLockMode.WriteOnly, bmp.PixelFormat); 

    Marshal.Copy(data, 0, bmpData.Scan0, data.Length); 

    bmp.UnlockBits(bmpData); 

    return bmp; 
} 

क्या इस डेटा प्रकार को सही तरीके से परिवर्तित करने का कोई अन्य तरीका है?

+0

मददगार लेख: [इस] (http://msdn.microsoft.com/en-us/library/ विंडोज/डेस्कटॉप/ee719797 (v = vs.85) .aspx) और [यह] (http://msdn.microsoft.com/en-us/library/ms969901.aspx) –

+0

उत्सुक: कैमरे का किस प्रकार का मॉडल/मॉडल बनाता है वह प्रारूप? इसके अलावा: [यह] (http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm) स्रोत कहता है कि यह एक 8 बिट मोनोक्रोम प्रारूप है। – TaW

+0

[इस स्रोत] से एक और उद्धरण (http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm): _RGB नीचे-ऊपर है, पहली पंक्ति में अनुक्रमणिका है (रेखा-1_ – TaW

उत्तर

2

यह आपकी छवि में एक रैखिक 8-बिट ग्रेस्केल पैलेट बनाता है।

bmp.UnlockBits(bmpData); 

var pal = bmp.Palette; 
for (int i = 0; i < 256; i++) pal.Entries[i] = Color.FromArgb(i, i, i); 
bmp.Palette = pal; 

return bmp; 

आप अभी भी स्कैन लाइनों को उलटने की आवश्यकता होगी हो सकता है इस तरह:

for (int y = 0; y < bmp.Height; y++) 
    Marshal.Copy(data, y * bmp.Width, 
      bmpData.Scan0 + ((bmp.Height - 1 - y) * bmpData.Stride), bmpData.Stride); 
+0

@ बैरी: कृपया लूप की स्थिति में 1-ऑफ सुधार को नोट करें! – TaW

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