我正在使用带有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
时遇到异常。然而,这个字节数组完全正常,SpriteBatch
和ArgumentException
显示它。我该如何解决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
?
答案 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
标题(由于打开规范,它并不是很难)。