- ホーム
- EMF
- 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