我正在尝试使用相机应用程序来拍摄一旦放大到全屏时清晰可辨的文档照片(我将我创建的 png 放入 pdf 文件中,以便我们可以将其传输到我们的数据库。
该平板电脑是带有原子处理器的完整版 Windows 平板电脑,而不是 RT。
如果我发送相机的默认尺寸(448x252),一切正常。当我尝试设置手动尺寸(相机支持 1920x1080、1280x720、960x540、640x480、640x360)时,出现未指定的错误。
SetConfigParms 函数中的 videoinfoheader 出现问题。如果我正常使用该功能,我会得到 -2147467259 的图像大小。我玩过它,我很确定图像大小应该是高 x 宽 x 1.5(至少是 448x252,而且无论分辨率如何,这也不会引发缓冲区长度错误)。所以我添加了:v.BmiHeader.ImageSize = iHeight * iWidth * 1.5 该应用程序在 448x252 下仍然可以正常工作,但如果我尝试 1280x720 或 1920x1080,我会收到未指定的错误。
我开始认为是其他没有更改的 videoinfoheader 数据搞砸了。例如,srcRect 保持在 0x448x0x252 即使在手动输入高度和宽度之后。ImageSize 不会自动计算(如上所述),其他参数也可能存在问题。
有没有人有关于如何手动计算 videoinfo 标头的所有字段的链接?或者有人可以帮我解决这个问题吗?我已经做了我能做的一切,我已经用谷歌搜索了几个小时......我就是无法得到它。
如果有帮助,这里是 SetConfigParms 函数。如果您想要任何其他功能或完整的相机类,请告诉我。它很长,所以在有人要求之前我不会包含它。
Private Sub SetConfigParms(pStill As IPin, iWidth As Integer, iHeight As Integer, iBPP As Short)
Dim hr As Integer
Dim media As AMMediaType
Dim v As VideoInfoHeader
Dim videoStreamConfig As IAMStreamConfig = TryCast(pStill, IAMStreamConfig)
' Get the existing format block
hr = videoStreamConfig.GetFormat(media)
DsError.ThrowExceptionForHR(hr)
Try
' copy out the videoinfoheader
v = New VideoInfoHeader()
Marshal.PtrToStructure(media.formatPtr, v)
' if overriding the width, set the width
If iWidth > 0 Then
v.BmiHeader.Width = iWidth
End If
' if overriding the Height, set the Height
If iHeight > 0 Then
v.BmiHeader.Height = iHeight
End If
' if overriding the bits per pixel
If iBPP > 0 Then
v.BmiHeader.BitCount = iBPP
End If
v.BmiHeader.ImageSize = iHeight * iWidth * 1.5
' Copy the media structure back
Marshal.StructureToPtr(v, media.formatPtr, True)
' Set the new format
hr = videoStreamConfig.SetFormat(media)
MsgBox(DsError.GetErrorText(hr))
DsError.ThrowExceptionForHR(hr)
Finally
DsUtils.FreeAMMediaType(media)
media = Nothing
End Try
End Sub