DirectShowで取得した画像をBMPファイルにする方法


takasi  2009-07-31 23:57:14  No: 142302

DirectShowを使用して、キャプチャーした画像をBMPファイルにしたいです。

   'ロング型に画像取得
        sz = vx * vy + 10    '最後の10は、BMPデータ
        ReDim img(sz - 1)
        bv.GetCurrentImage sz * 4, img(0)
        
上記のコードで、img()にデータが入っています。

    
Dim FileName As String
Dim FreeFileNo As Integer
    
    FreeFileNo = FreeFile
    FileName = App.Path & "\test.bmp"

    Open FileName For Binary As #FreeFileNo
        Put #FreeFileNo, , img()
    Close #FreeFileNo

上のコードでBMPが作成されると思うのですが、BMPとしてファイルがなりたちません。

根本的に間違ってると思いますが、読み込んだデータ(配列)から、直にBMPを作成できるのでしょうか?

ピクチャーBOX等に一度描写しないとだめなのでしょうか?


K.J.K.  2009-08-01 02:58:10  No: 142303

そのままでは BMP にはなりません。
BITMAPFILEHEADER の部分が抜けていますし。

また、長さには sz という変数名を普通は使いませんよね。
さらに、この値は ByRef で、且つ受け取った値にも意味が
あります。
その上で、タイプライブラリを改造して、第2引数に Cでの
NULL (VB での ByVal 0& など)を渡せるようにして、

Dim iBufferSize As Long
Dim bDIBImage() As Byte
Dim iTemp As Long

Call BasicVideo.GetCurrentImage(iBufferSize, Byval 0&)
iTemp = iBufferSize + 14&
ReDim bDIBImage(0& To iTemp - 1&)
Call BasicVideo.GetCurrentImage(iBufferSize, bDIBImage(14&))
bDIBImage(0&) = &H42
bDIBImage(1&) = &H4D
' この後、bDIBImage(2& 〜 5&) に iTemp の値を入れる。
' また、取得した BITMAPINFO から ビットマップデータ(HeaderやPaletteを
' 除いた領域)への Offset を取得し、それを bDIBImage(10& 〜 13&)に入れる。

という感じでは。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加