我使用MicrosoftSurface2.0SDK和SUR40 PixelSense兼容的计算机。我需要从它的触摸捕捉图像,并将其保存为.bmp。由于Surface附带了RawImageVisualizer示例,它通过触摸显示屏幕上的图片,因此我尝试修改将图片写入硬盘的程序。问题是,在构建ArgumentException: Parameter is invalid的过程中,我从从touch捕获的字节数组中获得了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?
发布于 2016-07-13 13:41:21
我刚刚意识到,UpdateRawImage不返回PNG文件的字节表示,而只返回像素数组。因此,要从它构建图像,必须将文件结构的所有其他部分写入数组:标头和颜色表(如果需要)。在许多情况下,这可以简单地用一个System.Drawing.Bitmap构造函数来完成:
public Bitmap(
int width,
int height,
int stride,
PixelFormat format,
IntPtr scan0
)但是我没有那么幸运,因为UpdateRawImage返回8bpp灰度像素,而PixelFormat枚举不支持它们(最接近的是Format16bppGrayScale,但它使用两个字节作为像素,而不是一个)。因此,在这种特殊情况下,有两个明显的解决方案。第一个是制作一个新的像素数组,它符合PixelFormat标准之一(这是我的选择,因为我需要24位RGB图像,尽管它实际上是黑白的,只有256个阴影)。第二种方法是手动编写BMP头(而且由于打开规范而不是很困难)。
https://stackoverflow.com/questions/38346927
复制相似问题