イグトランスさん、返信ありがとうございます。
CreateDIBSectionを書いてた所に教えてもらったのを書きました。
それ以外は①のAVI2BMPの内容と同じです。
実質BITMAPINFOHEADERそのものということで以下のようにしました。
Hozon()の内容は②のMainWnd_IDM_SAVE_MenuClick()とほぼ同じですが、一応載せます。
コード: 全て選択
GdipCreateBitmapFromGdiDib(ByVal ptr,VarPtr(bfh),g_gpBitmap)
Hozon()
コード: 全て選択
Sub Hozon()
Dim Buffer As String
Dim pwFileName As WordPtr
Dim dwFNSize As DWord
Dim sClsId As String
Dim pwClsId As WordPtr
Dim dwCISize As DWord
Dim tClsId As CLSID
'毎回選択するのは面倒なので決め打ち
Buffer ="C:\Program Files\ActiveBasic\MyProjects\ImageViewerAB\Avi2J.jpg"
sClsId = CLSID_JPEG
'ファイルパスワイド文字格納領域サイズを取得し、動的に確保する ワイド文字に変換する
dwFNSize = MultiByteToWideChar(0, 0, StrPtr(Buffer), -1, 0, 0) * 2
pwFileName = malloc(dwFNSize)
MultiByteToWideChar(0, 0, StrPtr(Buffer), -1, pwFileName, dwFNSize)
'クラスIDワイド文字格納領域サイズを取得し、動的に確保する クラスIDをワイド文字に変換する
dwCISize = MultiByteToWideChar(0, 0, StrPtr(sClsId), -1, 0, 0) * 2
pwClsId = malloc(dwCISize)
MultiByteToWideChar(0, 0, StrPtr(sClsId), -1, pwClsId, dwCISize)
'クラスID文字列から128BitクラスID値を取得する
If CLSIDFromString(pwClsId As Long, tClsId) <> 0 Then
MessageBox(hMainWnd, "ファイル形式のID値取得に失敗しました", "エラー", MB_OK)
free(pwFileName)
free(pwClsId)
Exit Sub
End If
'指定形式でファイルを保存する 確保したワイド文字格納領域を解放する
If GdipSaveImageToFile(g_gpBitmap, pwFileName As Long, tClsId, 0) <> 0 Then
MessageBox(hMainWnd, "ファイルの保存に失敗しました", "エラー", MB_OK)
Else
MessageBox(hMainWnd, "ファイルを保存しました", "成功", MB_OK)
End If
free(pwFileName)
free(pwClsId)
End Sub
しかし、②のGdipSaveImageToFileのところでファイルの書き込みに失敗します。(0Kbyteのjpgファイルは作成されます)
何度も試していると、落ちたり、落ちなかったり、その場所も毎回違うのですが
②のMainWnd_Paintを消すと落ちる事がなくなりました。
GDI+のBitmapオブジェクトが正確に得られてないのでしょうか?
ptrをBITMAPINFOにコピーし、GdipCreateBitmapFromGdiDibに入れたりしましたが結果は変わりません。
デバッグ実行すると、アクセス違反がでるAVIStreamGetFrameOpenの
第二引数に、NULLやBITMAPINFOHEADERを入れてるサンプルを見たので
試したところ急に落ちてしまいます。(落ちない時もあった)
結局、色々いじっても成功しませんでした。
なので、どこが間違っているのか教えて頂けないでしょうか。
宜しくお願いします。