1

一度全画面表示に拡大すると判読できるドキュメントの写真を撮るカメラ アプリを取得しようとしています (作成した png を pdf ファイルに入れて、データベースに転送できるようにします。

タブレットは、RT ではなく、atom プロセッサを搭載したフル バージョンの Windows タブレットです。

カメラのデフォルト サイズ (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ください - やらないPlanesBitCountなどCompression

このようには機能しません。初心者向けに明確に定義されたフォーマットが必要です。その後、デバイスによって受け入れられるか拒否される可能性があります。

次のようにする必要があります( 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 に答える