分類:[VB.NET/VB2005 以降]
2009/08/25(Tue) 12:44:20 編集(投稿者)
お世話になっております。
WindowsVista64Bit、VisualStudio2008・VB.NETにて開発しております。
画像関係のアプリケーションを開発しているのですが、.NETのGDIクラスでの画像描画では大きいサイズのファイルを描画すると
速度的な問題があり、Win32APIを使用する事になりました。
VB内でVirtualAllocを使用して確保した領域に対してデータを書き込み、DIBの情報を作成しStretchDIBits関数に渡しているのですが
戻り値・GetLastErrorの取得値が共に0となり画像が表示されません。
以下がソースになります。
Dim PicDraw as Graphics
PicDraw = PictureBox1.CreateGraphics
'// HDCの取得
Dim ImageHDC as IntPtr
ImageHDC = PicDraw.GetHDC()
'// DIB情報作成 実際の構造体はDWORD/WORDが混じっておりMarshalCopyできない為、DWORDにて統一。
Dim Bitinfo(10) as Integer
'// 構造体サイズ
Bitinfo(0) = 40
'// イメージ横サイズ
Bitinfo(1) = 400
'// イメージ縦サイズ
Bitinfo(2) = 400
'// BitCountとPlanesはWORDの為、ShiftしてDWORDに突っ込む
Bitinfo(3) = 24
'// BitCount 24
Bitinfo(3) = Bitinfo(3) << 16
'// Planes 1
Bitinfo(3) = Bitinfo(3) or 1
'// Compression BI_RGB = 0
Bitinfo(4) = BI_RGB
'// 作成した情報をポインタへ格納
Dim pBI as IntPtr
'// 領域の確保
pBI = Marshal.AllocHGlobal(40)
'// ポインタへ格納
Marshal.Copy(Bitinfo, 0, pBI, 10)
'// 関数の戻り値
Dim fRet as integer
'// 関数のエラー取得用
Dim fError as integer
'// ImagePtr:画像データの入ったVirtualAllocで確保した領域のポインタ
'// DIB_RGB_COLORS = 0, SRCCOPY = &HCC0020
fRet = StretchDIBits(ImageHDC, 0, 0, 400, 400, 0, 0, 400, 400, ImagePtr, pBI, DIB_RGB_COLORS, SRCCOPY)
fError = GetLastError
PicDraw.Dispose()
何かお気づきの点がありましたら、お手数ではございますがご教授頂けると幸いです。