2016-07-13 28 views
0

我正在使用Microsoft Surface 2.0 SDK與SUR40 PixelSense兼容計算機。我需要從它的觸摸中捕捉圖像並將其保存爲.bmp。由於Surface SDK附帶RawImageVisualizer示例,它顯示屏幕上的觸摸圖片,我試圖修改用於將圖片寫入HDD的程序。問題是,在從觸摸捕獲的字節數組構建Image期間,我得到ArgumentException: Parameter is invalid從PixelSense兼容PC中捕獲圖像並將其保存爲.bmp

這是我如何檢索與圖像數據的字節數組從FrameReceivedEventArgsFrameReceived事件:

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文件的字節表示,但只返回一個像素數組。因此,爲了從中構建一個圖像,必須將文件結構的所有其他部分寫入數組:頭和顏色表(如果需要)。在許多情況下,這可以System.Drawing.Bitmap的一個構造函數來簡單地完成:

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

但我就沒有那麼幸運,因爲UpdateRawImage回報8bpp的灰度像素,PixelFormat枚舉不支持(最密切的是Format16bppGrayScale,但它使用2個字節的像素,而不是一個)。所以,在這種特殊情況下,有兩個明顯的解決方案。首先是製作一組新的像素,它符合PixelFormat標準之一(這是我的選擇,因爲我需要24位RGB圖像,儘管它實際上只有256色陰影的黑白)。第二個是手動編寫BMP標題(並且由於打開規範,這不是很困難)。

相關問題