我试图让相机应用程序拍摄一张图片,这些图片一旦被炸成全屏就清晰可辨(我将我创建的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
答案 0 :(得分:2)
您初始化的字段太少了......比较您设置的字段以及VIDEOINFOHEADER
+ BITMAPINFOHEADER
中定义的字段 - 您没有Planes
,BitCount
, Compression
等。
它不能像这样工作,你需要一个定义良好的初学者格式,然后它可能被设备接受或拒绝。
必须是this(C#):
var vif = new VideoInfoHeader();
vif.BmiHeader = new BitmapInfoHeader();
// The HEADER macro returns the BITMAPINFO within the VIDEOINFOHEADER
vif.BmiHeader.Size = Marshal.SizeOf(typeof (BitmapInfoHeader));
vif.BmiHeader.Compression = 0;
vif.BmiHeader.BitCount = bitCount;
vif.BmiHeader.Width = width;
vif.BmiHeader.Height = height;
vif.BmiHeader.Planes = 1;
int iSampleSize = vif.BmiHeader.Width*vif.BmiHeader.Height*(vif.BmiHeader.BitCount/8);
vif.BmiHeader.ImageSize = iSampleSize;