長文ですみません。
どこに問題があるのかわからないので、全部書かせてください。
GetObjectでbmpファイルのbiSizeImageが0になるのです。
どこに問題があるのかわかりません。
どなたかご教授願います。
環境はWindowsXP、VisualBasic.NET2003、Microsoft.NET Frameworks 1.1です。
よろしくお願いします。
---プログラム---
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim file = "C:\image.bmp"
Dim hbmp As IntPtr = win32.LoadImage(IntPtr.Zero, file, win32.IMAGE_BITMAP, 0, 0, win32.LR_LOADFROMFILE)
Dim bmi As win32.BITMAPINFO
Dim res As Integer = win32.GetObject(hbmp, Marshal.SizeOf(bmi), bmi)
MsgBox(bmi.bmiHeader.biSizeImage)
Application.Exit()
End Sub
Class win32
<DllImport("user32.dll", EntryPoint:="LoadImageA", SetLastError:=True)> _
Public Shared Function LoadImage( _
ByVal hinst As IntPtr, _
ByVal lpszName As String, _
ByVal uType As Integer, _
ByVal cxDesired As Integer, _
ByVal cyDesired As Integer, _
ByVal fuLoad As Integer _
) As IntPtr
End Function
<DllImport("gdi32.dll", SetLastError:=True)> _
Public Shared Function GetObject( _
ByVal hgdiobj As IntPtr, _
ByVal cbBuffer As Integer, _
ByRef lpvObject As BITMAPINFO _
) As Integer
End Function
Public Const IMAGE_BITMAP = 0
Public Const LR_LOADFROMFILE = &H10
<StructLayout(LayoutKind.Sequential)> _
Public Structure BITMAPINFOHEADER
Dim biSize As Integer
Dim biWidth As Integer
Dim biHeight As Integer
Dim biPlanes As Short
Dim biBitCount As Short
Dim biCompression As Integer
Dim biSizeImage As Integer
Dim biXPelsPerMeter As Integer
Dim biYPelsPerMeter As Integer
Dim biClrUsed As Integer
Dim biClrImportant As Integer
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure RGBQUAD
Dim rgbBlue As Byte
Dim rgbGreen As Byte
Dim rgbRed As Byte
Dim rgbReserved As Byte
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure BITMAPINFO
Dim bmiHeader As BITMAPINFOHEADER
Dim bmiColors As RGBQUAD
End Structure
End Class
biSizeImageは、0もしくは「有効な値」が設定されているはずです。
非圧縮なら0が一般的でしょう。
K.J.K.さん、ありがとうございます。
そうなんですか・・・
ただ、GetDIBitsではちゃんと取得できるのです。
GetObjectで取得した時の値と微妙に違うので、何か間違っている気もします。
実際に動かすのはWindowsCE上なんですが、GetDIBitsが使えません。
ただでさえ.NETになって、今までのVisualBasicと別物みたいなのに・・・
[GetObject]
bmiHeader.biSize=0 <--何で0になってしまうの
bmiHeader.biWidth=400
bmiHeader.biHeight=1000
bmiHeader.biPlanes=50
bmiHeader.biBitCount=0
bmiHeader.biCompression=65537(&h10001) <-これも何かあやしい値
bmiHeader.biSizeImage=0
bmiHeader.biXPelsPerMeter=0
bmiHeader.biYPelsPerMeter=0
bmiHeader.biClrUsed=0
bmiHeader.biClrImportant=0
[GetDIBits]
bmiHeader.biSize=40
bmiHeader.biWidth=400
bmiHeader.biHeight=1000
bmiHeader.biPlanes=1
bmiHeader.biBitCount=1
bmiHeader.biCompression=0
bmiHeader.biSizeImage=52000
bmiHeader.biXPelsPerMeter=0
bmiHeader.biYPelsPerMeter=0
bmiHeader.biClrUsed=2
bmiHeader.biClrImportant=2
それは単純に受ける容れ物を間違えているだけでは。
>それは単純に受ける容れ物を間違えているだけでは。
多分そうなんでしょう。
それかGetObjectの宣言がおかしいのか。
でも、BITMAPINFOは共通で使っているから宣言的には正しいと思いたいし。
とりあえず、BITMAP構造体を調べてみては。
仮にDIBであったとしたらDIBSECTION構造体が使えますが。
>とりあえず、BITMAP構造体を調べてみては。
BITMAPでした。
うーん、そうだった。
ありがとうございました。
ツイート | ![]() |