2

我正在使用 JavaScript 进行 Windows 8 Metro App 开发;但是,C# 并非不可能。我正在尝试找到一种方法来指定我的网络摄像头可以支持照片拍摄的最高分辨率。到目前为止,我一直在使用MediaCapture类,这样我就可以预览并捕捉图像。我注意到 CaptureUI 支持MaxPhotoResolution选项。但是,我希望这是自动的,不需要用户交互。我的想法不多了。这是针对信息亭应用程序的,因此欢迎使用变通方法,因为我可以完全控制设备。有什么想法或建议吗?

对于测试,我使用的是 LifeCam Studio。相机应用程序拍摄 1920x1080,而我的应用程序拍摄 640x480 的照片。此外,驱动程序附带的软件可以完美运行!这是我无法控制的吗?

更新

我一直在研究设置特定的相机设置;突然出现了;但是,到目前为止,我还没有运气......

9月18日更新

我一直在挖掘并想出了这个。返回分辨率属性;但是,setMediaStreamPropertiesAsync 方法无效!我的想法不多了。

12月13日更新

我决定最后一次尝试,并使用 18 日描述的一些方法,它通过 JavaScript 和 Lifecam Studio 在官方 Windows 8 版本上运行。至于为什么,我不知道。这是我使用的代码:

//media=MediaCapture object
function setBestResolution(media) {
    //Gets collection of objects each describing the resolution, etc.
    var resolutions = media.videoDeviceController.getAvailableMediaStreamProperties(Windows.Media.Capture.MediaStreamType.photo);
    var numResolutions=resolutions.length;

    for (var r = 0; r<resolutions;r++){
        var res = resolutions[r];
        //.width and .height are props. Debug to see all.
    }

    //I chose 40 as best option; however, programmatically you can choose any. I have dedicated kiosk app and same webcam and therefore don't need to.
    media.videoDeviceController.setMediaStreamPropertiesAsync(Windows.Media.Capture.MediaStreamType.photo, resolutions[40]);
}
4

1 回答 1

0

我有点不清楚你想做什么。您想捕捉特定的照片分辨率还是想以特定的纵横比捕捉问题?

使用 CameraCaptureUI 时,您可以使用 PhotoSettings 属性设置捕获照片的条件:

http://msdn.microsoft.com/en-us/library/windows/apps/windows.media.capture.cameracaptureui.photosettings.aspx

例如,您可以设置CroppedAspectRatio以确保图像始终为 4:3 或 16:9。您还可以设置MaxResolution属性来限制拍摄照片时的像素尺寸。

仅当您希望将自定义捕获体验作为应用程序的一部分而不是使用系统对话框时,才需要MediaCapture类。MediCapture 的默认初始化以最高分辨率初始化设备(我相信,虽然我没有测试过)。可以覆盖您希望 MediaCapture 捕获的分辨率,但您仅限于设备支持的分辨率。您可以列举设备支持的分辨率,您链接到的论坛帖子显示如何:

http://social.msdn.microsoft.com/Forums/en-SG/winappswithcsharp/thread/751b8d83-e646-4ce9-b019-f3c8599e18e0

当然,您的设备支持的分辨率可能不是您真正想要保持的分辨率或纵横比。因此,您最终可能不得不向用户展示裁剪照片的能力,并且最终可能不得不进一步调整图像大小。这将需要您需要构建的额外代码和额外的 UI 部分。如果您有代码允许用户裁剪,并且如果您有代码将图像大小(或下采样)调整为您想要的确切分辨率,那么实际上不需要更改 MediaCapture 设备初始化的分辨率。

一种策略是在ApplicationData.Current.TemporaryFolder中创建一个临时文件并在该临时文件上调用MediaCapture.CapturePhotoToStreamAsync。然后在您自己的 UI 中显示该文件以允许裁剪并最终将其大小调整为您想要的分辨率,然后再将最终图像保存到真正的目标文件夹。

尽管您必须创建自己的 UI 以允许用户选择他们想要保留的图像区域,但 CodePlex 上的 WriteableBitmapEx 项目可能会证明对实际裁剪和调整大小非常有帮助:

http://writeablebitmapex.codeplex.com/

于 2012-09-18T21:04:36.760 回答