VBAからGDI+を使う資料集
inet上の達人の方々から御教示いただいたコードを少しアレンジさせてもらっています(切り貼りとも言います)。
  1. ホーム
  2. EMF
  3. emfを読む習作2


emfを読む習作、header recordを読む

emfのheader recordを読む習作です。
BMPファイルの解像度(dpi)を操作できるフリーソフトで72dpiに設定した200角pixelの画像ファイルを挿入/図/ファイルから貼り付けた物に対して実行してみました


emfWidth       266 ← 200*96/72に合致します(96dpiの画像の時は200になります)
emfHeight      266 ←同上
.rclBounds.Left              0 
.rclBounds.Right             266 
.rclBounds.Top               0 
.rclBounds.Bottom            266 
.rclFrame.Left               0 
.rclFrame.Right              7040 ←7.04cm = 200*2.54/72に合致します(元のpixel数×ptのmm換算値)
.rclFrame.Top  0 
.rclFrame.Bottom             7057 ←若干の誤差はありますが同上です
.szlDevice.cx  1024 ← これは画面のピクセルサイズらしく、画像ファイルのdpiを問わず同じでした
.szlDevice.cy  768  ← 同上
.szlMillimeters.cx           270 ←画面のmmサイズらしく、画像ファイルのdpiを問わず同じでした
.szlMillimeters.cy           203 ←同上

ここで得られる数値は、シート上で画像の寸法を操作すると変わってしまいます(SZ..を除く)
従って、シート上の画像サイズの「リセット」に必要な寸法を包含しているとは思えません。

Private Sub readEMFheader()
  Dim hemf As Long '拡張メタファイルのハンドル
  Dim mh As ENHMETAHEADER '取得結果のメタファイルヘッダ
  Dim emfWidth As Long, emfHeight As Long
  
  Selection.Copy
  If OpenClipboard(0) Then
    hemf = GetClipboardData(CF_ENHMETAFILE)
    ' ハンドルを複製してから使用する
    hemf = CopyEnhMetaFile(hemf, vbNullString)
    CloseClipboard
  End If
  If hemf = 0 Then
    MsgBox "emf取得に失敗"
    Exit Sub  ' 失敗
  End If
   'ヘッダの取得
  GetEnhMetaFileHeader hemf, Len(mh), mh
  With mh
    emfWidth = .rclBounds.Right - .rclBounds.Left
    emfHeight = .rclBounds.Bottom - .rclBounds.Top
    Debug.Print "emfWidth", emfWidth
    Debug.Print "emfHeight", emfHeight
    Debug.Print ".rclBounds.Left", .rclBounds.Left
    Debug.Print ".rclBounds.Right", .rclBounds.Right
    Debug.Print ".rclBounds.Top", .rclBounds.Top
    Debug.Print ".rclBounds.Bottom", .rclBounds.Bottom
    Debug.Print ".rclFrame.Left", .rclFrame.Left
    Debug.Print ".rclFrame.Right", .rclFrame.Right
    Debug.Print ".rclFrame.Top", .rclFrame.Top
    Debug.Print ".rclFrame.Bottom", .rclFrame.Bottom
    Debug.Print ".szlDevice.cx", .szlDevice.cx
    Debug.Print ".szlDevice.cy", .szlDevice.cy
    Debug.Print ".szlMillimeters.cx", .szlMillimeters.cx
    Debug.Print ".szlMillimeters.cy", .szlMillimeters.cy
  End With
  DeleteEnhMetaFile hemf
End