GetObjectでのbiSizeImageの値が出ない

解決


アルルカン  2005-07-29 02:11:12  No: 91140

長文ですみません。
どこに問題があるのかわからないので、全部書かせてください。

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


K.J.K.  2005-07-29 05:14:05  No: 91141

biSizeImageは、0もしくは「有効な値」が設定されているはずです。
非圧縮なら0が一般的でしょう。


アルルカン  2005-07-29 15:28:53  No: 91142

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


K.J.K.  2005-07-29 19:07:06  No: 91143

それは単純に受ける容れ物を間違えているだけでは。


アルルカン  2005-07-29 21:45:30  No: 91144

>それは単純に受ける容れ物を間違えているだけでは。
多分そうなんでしょう。

それかGetObjectの宣言がおかしいのか。
でも、BITMAPINFOは共通で使っているから宣言的には正しいと思いたいし。


K.J.K.  2005-07-29 22:00:26  No: 91145

とりあえず、BITMAP構造体を調べてみては。
仮にDIBであったとしたらDIBSECTION構造体が使えますが。


アルルカン  2005-07-29 23:25:00  No: 91146

>とりあえず、BITMAP構造体を調べてみては。
BITMAPでした。
うーん、そうだった。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加