首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PixelSense兼容PC机的触摸中获取图像并保存为.bmp

从PixelSense兼容PC机的触摸中获取图像并保存为.bmp
EN

Stack Overflow用户
提问于 2016-07-13 08:52:27
回答 1查看 51关注 0票数 0

我使用MicrosoftSurface2.0SDK和SUR40 PixelSense兼容的计算机。我需要从它的触摸捕捉图像,并将其保存为.bmp。由于Surface附带了RawImageVisualizer示例,它通过触摸显示屏幕上的图片,因此我尝试修改将图片写入硬盘的程序。问题是,在构建ArgumentException: Parameter is invalid的过程中,我从从touch捕获的字节数组中获得了Image

我是这样从FrameReceivedEventArgsFrameReceived事件中检索图像数据的字节数组的:

代码语言:javascript
复制
event.UpdateRawImage(
                ImageType.Normalized,
                normalizedImage,
                0, 0,
                InteractiveSurface.PrimarySurfaceDevice.WorkingAreaWidth,
                InteractiveSurface.PrimarySurfaceDevice.WorkingAreaHeight);

这就是我尝试将字节作为.bmp写到磁盘上的方式:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-13 13:41:21

我刚刚意识到,UpdateRawImage不返回PNG文件的字节表示,而只返回像素数组。因此,要从它构建图像,必须将文件结构的所有其他部分写入数组:标头和颜色表(如果需要)。在许多情况下,这可以简单地用一个System.Drawing.Bitmap构造函数来完成:

代码语言:javascript
复制
public Bitmap(
    int width,
    int height,
    int stride,
    PixelFormat format,
    IntPtr scan0
)

但是我没有那么幸运,因为UpdateRawImage返回8bpp灰度像素,而PixelFormat枚举不支持它们(最接近的是Format16bppGrayScale,但它使用两个字节作为像素,而不是一个)。因此,在这种特殊情况下,有两个明显的解决方案。第一个是制作一个新的像素数组,它符合PixelFormat标准之一(这是我的选择,因为我需要24位RGB图像,尽管它实际上是黑白的,只有256个阴影)。第二种方法是手动编写BMP头(而且由于打开规范而不是很困难)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38346927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档