こんにちは。他の質問掲示板にも載せていますが、たくさん
の方から情報を頂くため、こちらにも投稿させて頂きます。
現在、VB.net(2008)でAVIファイルから映像を1/60フィールドごとに
BMP形式で保存するソフトを作成しています。以前、VB6.0で
同様のソフトを作っていましたが、Vista以降、ソフトがうまく
作動しなくなったので、VB2008での作成を始めました。
いろいろなサイトを検索して、vb2008でAVIから1/30ごとの映像を
BMP形式で取り出すところまではできましたが、どうしてもvb2008で
1/30から1/60に分割するところがうまくできません(下記VB6.0の
ソース中のプロシジャー「SeparateDIB」)。
そこで、みなさまのお知恵をお借りしたいと思い、投稿させて
頂きました。どうかよろしくお願い致します。
下記、VB6.0のソースです。
Public Sub AVI_to_BMP(ByVal strAVIFileName As String, ByVal strBMPFileName As String, ByVal lngAVIFrameNo As Long, ByVal intSeparateType As Integer)
Dim pAVIFile As Long
Dim pAVIStream As Long
Dim pGetFrameObj As Long
Dim pDIB As Long
Dim bmpIH As BITMAPINFOHEADER
AVIFileInit
AVIFileOpen pAVIFile, strAVIFileName, OF_READ, 0&
AVIFileGetStream pAVIFile, pAVIStream, streamtypeVIDEO, 0
With bmpIH
.biSize = 40
.biWidth = 0
.biHeight = 0
.biPlanes = 1
.biBitCount = 24
.biCompression = 0
.biSizeImage = 0
.biXPelsPerMeter = 0
.biYPelsPerMeter = 0
.biClrUsed = 0
.biClrImportant = 0
End With
pGetFrameObj = AVIStreamGetFrameOpen(pAVIStream, bmpIH)
pDIB = AVIStreamGetFrame(pGetFrameObj, lngAVIFrameNo)
GetPackedDIBPointer pDIB
SeparateDIB intSeparateType
PutToBMPFile strBMPFileName
ErrorOut:
AVIStreamGetFrameClose pGetFrameObj
AVIStreamRelease pAVIStream
AVIFileRelease pAVIFile
AVIFileExit
wdt(d) = bmpIH.biWidth
hgt(d) = bmpIH.biHeight
End Sub
Public Function AVIFrameMax(strAVIFileName As String) As Long
Dim pAVIFile As Long
Dim pAVIStream As Long
Call AVIFileInit
Call AVIFileOpen(pAVIFile, strAVIFileName, OF_READ, 0&)
Call AVIFileGetStream(pAVIFile, pAVIStream, streamtypeVIDEO, 0)
AVIFrameMax = AVIStreamLength(pAVIStream) - 1
Call AVIStreamRelease(pAVIStream)
Call AVIFileRelease(pAVIFile)
Call AVIFileExit
End Function
Private Sub GetPackedDIBPointer(ByRef pDIB As Long)
Call CopyMemory(ByVal VarPtr(m_BmpIH.biSize), ByVal pDIB, Len(m_BmpIH))
ReDim m_memBits(0 To m_BmpIH.biSizeImage - 1)
Call CopyMemory(m_memBits(0), ByVal pDIB + 40, m_BmpIH.biSizeImage)
With m_BmpFH
.bftype = "BM"
.bfSize = 55 + m_BmpIH.biSizeImage
.bfReserved1 = 0&
.bfReserved2 = 0&
.bfOffBits = 54
End With
End Sub
Private Sub PutToBMPFile(ByVal strFileName As String)
Dim intFileNumber As Integer
intFileNumber = FreeFile()
Open strFileName For Binary As intFileNumber
Put intFileNumber, 1, m_BmpFH
Put intFileNumber, Len(m_BmpFH) + 1, m_BmpIH
Put intFileNumber, , m_memBits
Close intFileNumber
End Sub
Private Sub SeparateDIB(ByVal intSeparateType As Integer)
Dim j As Long
Dim k As Long
Dim l As Long
Select Case intSeparateType
Case 0
For j = 0 To m_BmpIH.biHeight - 2 Step 2
k = j * m_BmpIH.biWidth * 3
l = (j + 1) * m_BmpIH.biWidth * 3
Call CopyMemory(m_memBits(l), m_memBits(k), Len(m_memBits(k)) * m_BmpIH.biWidth * 3)
Next
Case 1
For j = 1 To m_BmpIH.biHeight - 2 Step 2
k = j * m_BmpIH.biWidth * 3
l = (j + 1) * m_BmpIH.biWidth * 3
Call CopyMemory(m_memBits(l), m_memBits(k), Len(m_memBits(k)) * m_BmpIH.biWidth * 3)
Next
End Select
End Sub
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>SeparateDIB
これでググると、ここの質問にしかたどり着きません。
サンプルも見つかりません。
APIの宣言でエイリアスとかで名前を変えてませんか?
VB6でうまくいって、.NET系でうまくいかないのであれば、APIの利用方法が一番怪しいです。
一番怪しい部分が、質問者さんの公開コードにありません。
また
>分割するところがうまくできません
どううまくいかないのかもわかりません。
・エラーが出ている場合
→どのようなエラー
・エラーは出ないが思ったような結果が出ない場合
→VB6の時の結果の詳細
→.NETでの結果の詳細
→→上記二点の差がわかるような説明
などの説明がないと、答えようがないかと。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) excel vba 参照渡しと値渡し 2 2022/04/27 10:45
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
visual C++ でビルドの中止がで...
-
コンパイルできません。
-
バッチからsqlplusの接続エラー...
-
Excelのエラーで困ってます。
-
fortranでプログラムを実行する...
-
sys/time.hのインクルードがで...
-
デバッグ中のエラーのことで教...
-
Fortran コンパイルエラーについて
-
dos.hについて
-
C言語でpgm形式の画像を読み込...
-
エクセルでマクロを実行すると...
-
HEWを使用しているのですが、こ...
-
SQLServerについて
-
Handlesについて
-
PC画面を録画するプログラムでd...
-
ビルド失敗 指定されたファイ...
-
ヘッダファイルでのFILE型引数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
バッチからsqlplusの接続エラー...
-
Excelのエラーで困ってます。
-
HEWを使用しているのですが、こ...
-
適切な変換関数が存在しない???
-
VB2008で定数に色の設定をした...
-
fortranでプログラムを実行する...
-
BC30002: 型 'ListItem' が定義...
-
VBAでファイルを開くプログラム...
-
sys/time.hのインクルードがで...
-
error C3867 関数呼び出しには...
-
デバッグ中のエラーのことで教...
-
visual C++ でビルドの中止がで...
-
LPCWSTRとchar
-
RightとLeft関数のライブ...
-
Handlesについて
-
multiple definitionというエラー
-
ACCESSのDate関数のエラー表示...
-
WindowsからLinuxへの移植
おすすめ情報