2016-07-13 13 views
0

私は、SUR40 PixelSense対応のコンピュータでMicrosoft Surface 2.0 SDKを使用しています。私はそれから触って画像をキャプチャし、それを.bmpとして保存する必要があります。 Surface SDKにはRawImageVisualizerのサンプルが付属しているので、画面にタッチして画像を表示するので、画像をHDDに書き込むプログラムを修正しようとしました。問題は、touchから取得したバイト配列から、Imageをビルド中にArgumentException: Parameter is invalidを取得することです。PixelSense対応のPCのタッチから画像をキャプチャし、.bmpとして保存

これは私がFrameReceivedイベントにFrameReceivedEventArgsからの画像データのバイト配列を取得する方法である:

event.UpdateRawImage(
       ImageType.Normalized, 
       normalizedImage, 
       0, 0, 
       InteractiveSurface.PrimarySurfaceDevice.WorkingAreaWidth, 
       InteractiveSurface.PrimarySurfaceDevice.WorkingAreaHeight); 

そして、それは私がディスクに.bmpとしてバイトを書いてみる方法は次のとおりです。

System.Drawing.Image img; 
using (System.Drawing.Image raw = System.Drawing.Image.FromStream(new MemoryStream(normalizedImage))) 
{ 
    img = raw.Clone() as System.Drawing.Bitmap; 
} 
img.Save("C:/img.bmp", System.Drawing.Imaging.ImageFormat.Bmp); 

だから私は取得ストリームからImageを作成しようとした例外です。それにもかかわらず、このバイト配列はそれを表示するTexture2DSpriteBatchで完全に正常に機能します。 ArgumentExceptionを修正するにはどうすればよいですか?

答えて

0

UpdateRawImageはファイルPNGのバイト表現を返しませんが、ピクセルの配列のみを返します。したがって、イメージを構築するには、ファイル構造の他のすべての部分をヘッダーとカラーテーブル(必要に応じて)に書き込む必要があります。多くの場合、これは、単に1 System.Drawing.Bitmapのコンストラクタで行うことができます。

public Bitmap(
    int width, 
    int height, 
    int stride, 
    PixelFormat format, 
    IntPtr scan0 
) 

しかし、私はとても幸運ではなかった、UpdateRawImageリターンがグレースケールのピクセルを8bppのため、そしてPixelFormat列挙型は、それらをサポートしていません(最も近いがFormat16bppGrayScaleあり、ピクセルではなく2バイトを使用します)。したがって、この特定の状況では、2つの明白な解決策があります。最初は、PixelFormatの基準の1つを満たすピクセルの新しい配列を作成しています(これは私が選択したものですが、実際には256階調の白黒ですが、24ビットRGBイメージが必要です)。 2番目は手動でBMPヘッダーを書きます(オープン仕様のため難しくありません)。

関連する問題