2009-03-12 6 views
2

長年のプロセスを経た私のプロジェクトでは、私はIRカメラから2次元バイト配列を得ました。2次元バイト配列からイメージを作成する方法は?

バイト配列は、それに画像を保持している... C#で画像にそのバイト配列に変換する方法

..

私は

MemoryStream ms = new MemoryStream(byteArray); 
System.drawing.Image im = Image.FromStream(ms); 

によって私たちは、1次元を渡すことができることを知っています配列に変換してイメージに変換します。

2次元配列を1次元配列として渡すと、エラーが表示されます。

これを修正する方法.. ???? 2次元バイト配列をイメージに変換する方法は?

ありがとうございました!

答えて

2

あなたはバイト配列がinorderを処理する場合は、次の

byte[][] doubleArray = GetMyByteArray(); 
byte[] singleArray = doubleArray.SelectMany(x => x).ToArray(); 
MemoryStream ms = new MemoryStream(singleArray); 
System.drawing.Image im = Image.FromStream(ms); 

を行うことができますSelectManyメソッドは、本質的に配列の配列を受け取り、順番に要素を返します。最初の配列の最初の要素から始め、配列を終えて次の配列に移動します。これは、すべての要素が処理されるまで続きます。それは代わりにジャグ配列(byte[][])の長方形の配列(すなわちbyte[,])なら

+0

これは、ストリームが認識された画像フォーマットであると想定していません。 png、jpg、gif? IRカメラが2Dバイト配列を提供しているなら、私はそれが生データであると疑います。それが私の解決策を提案した理由です。私はこれが*うまくいかないと言っているわけではありませんが、カメラが提供するフォーマットに依存します。 –

+0

@ジョン、完全に同意します。これはカメラが実際に返すものに非常に依存しています。 – JaredPar

+0

多次元配列の場合は、その型を知っているのでキャストできます。 array.Cast ().ToArray() – Samuel

4

することは、あなたいくつかの危険なコードをかなり単純にそれを行うことができるかもしれません。

は私parallel Mandelbrot set generation codeを見てください - のみ下ビットは、パレットとデータのブロックからビットマップを構築する場合には、興味深いものです:

byte[] data = query.ToArray(); 

unsafe 
{ 
    fixed (byte* ptr = data) 
    { 
     IntPtr scan0 = new IntPtr(ptr); 
     Bitmap bitmap = new Bitmap(ImageWidth, ImageHeight, // Image size 
            ImageWidth, // Scan size 
            PixelFormat.Format8bppIndexed, scan0); 
     ColorPalette palette = bitmap.Palette; 
     palette.Entries[0] = Color.Black; 
     for (int i=1; i < 256; i++) 
     { 
      palette.Entries[i] = Color.FromArgb((i*7)%256, (i*7)%256, 255); 
     } 
     bitmap.Palette = palette; 
     // Stuff 
    } 
} 

私はあなたが配列の固定を解除することができるかどうかわかりませんビットマップを作成した後、私がこれをプロダクションコードに使用していたなら、それをもっと詳しく見てみましょう。

+0

Jon Skeetがベストになったのですか、JaredParの答えに問題がありますか(質問者がそれを持っていない場合はLINQが必要です)。 – Samuel

+0

私は必ずしもJaredのソリューションがうまくいくとは確信していません。また、OPにbyte [] []またはbyte [、]があるかどうかによって異なります。 –

+0

私は今、バイトの[、] JaredParの答えのために動作しません誰かが好奇心がある場合、http://stackoverflow.com/questions/275073/why-does-c-multidimensional-arrays-not-implement-ienumerabletを参照してください。 – Samuel

関連する問題