1

我正在尝试使用相机应用程序来拍摄一旦放大到全屏时清晰可辨的文档照片(我将我创建的 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
4

1 回答 1

2

您初始化的字段太少...比较您设置的字段和在VIDEOINFOHEADER+中定义的字段BITMAPINFOHEADER- 您不这样做PlanesBitCountCompression

它不是这样工作的,您需要为初学者定义一个明确的格式,然后它可能会被设备接受或拒绝。

它必须是这样的(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;
于 2013-06-15T07:04:05.937 回答