ビットマップの画像情報を取得          <TOP>


CreateCompatibleDC 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
GetObject オブジェクト取得
GetObjectType 指定のオブジェクトのタイプを取得
LoadImage 画像ファイルの読み込み
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
BitBlt ビットブロックを転送
GetDC 指定されたウィンドウのデバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
 

 

'================================================================
'= ビットマップの画像情報を取得
'=    (GetObject2.bas)
'================================================================
#include "Windows.bi"

Type BITMAP
    bmType       As Long      'ビットマップ タイプを指定(0)
    bmWidth      As Long      'ビットマップの幅を指定
    bmHeight     As Long      'ビットマップの高さを指定
    bmWidthBytes As Long      '1 走査線あたりのバイト数を指定
    bmPlanes     As Integer   'カラープレーンを指定(通常1)
    bmBitsPixel  As Integer   '1 ピクセルを定義するのに必要なビット数を指定
    bmBits       As Long      'ビット データが格納されているの配列へのポインタを指定
End Type

#define OBJ_DC 3                        'デバイスコンテキスト
#define OBJ_ENHMETADC 12                '拡張メタファイルのデバイスコンテキスト
#define OBJ_ENHMETAFILE 13              '拡張メタファイル
#define OBJ_EXTPEN 11                   '拡張ペン
#define OBJ_FONT 6                      'フォント
#define OBJ_MEMDC 10                    'メモリデバイスコンテキスト
#define OBJ_METADC 4                    'メタファイルのデバイスコンテキスト
#define OBJ_METAFILE 9                  'メタファイル
#define OBJ_PAL 5                       'パレット
#define OBJ_PEN 1                       'ペン
#define OBJ_REGION 8                    '領域
#define OBJ_BITMAP 7

#define IMAGE_BITMAP 0                  'ビットマップ
#define IMAGE_CURSOR 2                  'カーソル
#define IMAGE_ENHMETAFILE 3             '拡張メタファイル
#define IMAGE_ICON 1                    'アイコン
#define LR_LOADFROMFILE &H10            '外部ファイルからロードする
#define LR_CREATEDIBSECTION &H2000      'デバイス独立ビットマップとしてロードする
#define SRCCOPY &HCC0020                'そのまま転送

' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&)

' オブジェクト取得
Declare Function Api_GetObject& Lib "gdi32" Alias "GetObjectA" (ByVal hObject&, ByVal nCount&, lpObject As Any)

' 指定のオブジェクトのタイプを取得
Declare Function Api_GetObjectType& Lib "gdi32" Alias "GetObjectType" (ByVal hgdiobj&)

' 画像ファイルの読み込み
Declare Function Api_LoadImage& Lib "user32" Alias "LoadImageA" (ByVal hInst&, ByVal lpszName$, ByVal uType&, ByVal cxDesired&, ByVal cyDesired&, ByVal fuLoad&)

' 指定されたデバイスコンテキストのオブジェクトを選択
Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&)

' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー
Declare Function Api_BitBlt& Lib "gdi32" Alias "BitBlt" (ByVal hDestDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal dwRop&)

' 指定されたウィンドウのデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

Var Shared Picture1 As Object
Var Shared Edit1 As Object
Var Shared Text1 As Object
Var Shared Text2 As Object
Var Shared Button1 As Object

Picture1.Attach GetDlgItem("Picture1")
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 12
Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared FileName As String
Var Shared hDC As Long

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var bm As BITMAP
    Var hBitmap As Long
    Var BitmapDC As Long
    Var Ret As Long
   
    hDC = Api_GetDC(Picture1.GethWnd)

    Picture1.Cls

    'ファイルからBitmapをロード
    hBitmap = Api_LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE Or LR_CREATEDIBSECTION)

    '呼び出し失敗の場合終了
    If (hBitmap = 0) Then
        A% = MessageBox("Bitmap Load Error", "Error, Bitmapファイルではありません!", 0, 2)
        End
    End If

    'ロードしたBitmapのデバイスコンテキストを作成
    BitmapDC = Api_CreateCompatibleDC(0)

    '失敗した場合プロシージャを抜ける
    If (BitmapDC = 0) Then
        A% = MessageBox("Device Context Error", "Error, デバイスコンテキストを作成できません!", 0, 2)
        Exit Sub
    End If

    '作成されたデバイスコンテキストにBitmapをAttach
    Ret = Api_SelectObject(BitmapDC, hBitmap)

    'イメージ情報を取得
    Ret = Api_GetObject(hBitmap, Len(bm), bm)

    'Pictureに描画
    Ret = Api_BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, BitmapDC, 0, 0, SRCCOPY)

    Text1.SetWindowText Trim$(Str$(bm.bmBitsPixel)) & "Bit"
    Text2.SetWindowtext Trim$(Str$(bm.bmWidth)) & "x" & Trim$(Str$(bm.bmHeight))

    Ret = Api_ReleaseDC(hDC, Picture1.GethWnd)
End Sub

'================================================================
'= シェルドロップされたファイル名を取得
'================================================================
Declare Sub Edit1_DropFiles edecl (ByVal DF As Long)
Sub Edit1_DropFiles(ByVal DF As Long)
    Var CN As Long

    CN = GetDropFileCount(DF)
    FileName = GetDropFileName(DF, 0)
    Edit1.SetWindowText FileName
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_QueryClose edecl ()
Sub MainForm_QueryClose()
    Var Ret As Long

    Ret = Api_ReleaseDC(Picture1.GethWnd, hDC)
    End
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End