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等に一度描写しないとだめなのでしょうか?
そのままでは 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&)に入れる。
という感じでは。