通过触摸兼容PixelSense的PC捕获图像并将其另存为.bmp

时间:2016-07-13 08:52:27

标签: c# image bitmapimage pixelsense

我正在使用带有SUR40 PixelSense兼容计算机的Microsoft Surface 2.0 SDK。我需要从中触摸图像并将其保存为ArgumentException: Parameter is invalid。由于Surface SDK带有RawImageVisualizer示例,它在屏幕上显示触摸图片,我试图修改用于将图片写入HDD的程序。问题是,在从触摸捕获的字节数组构建Image期间,我得到FrameReceivedEventArgs

这是我使用FrameReceived事件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

因此我尝试从流中创建Texture2D时遇到异常。然而,这个字节数组完全正常,SpriteBatchArgumentException显示它。我该如何解决object Form1: TForm1 Caption = 'Form1' ClientHeight = 340 ClientWidth = 639 object b_Test: TButton Caption = 'Test' OnClick = b_TestClick end object od_test: TOpenDialog Filter = 'blub (blub*.dbf)|blub*.dbf|bla (bla?.dbf)|bla?.dbf' end end

1 个答案:

答案 0 :(得分: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标题(由于打开规范,它并不是很难)。