seniors 发表于 2013-6-9 21:52:45

第十四讲 GDI+图像之图元文件

GDI+图像
一、图像有三类
Image、Bitmap、Metafile
Image类是一个抽象类,不能直接实例化。Bitmap 类和Metafile 类是从Image类继承的。
Bitmap 类是光栅图像,我的理解就是点阵图像。Metafile 类是矢量图像。
1、Image类是一个抽象类,不能直接实例化。
也就是Image分成两大类(Bitmap和Metafile),Image不能新建只能从文件读取
$hImage = _GDIPlus_ImageLoadFromFile($sFileName)
其实读取出来后,$hImage要么是Bitmap要么是MetaFile,是根据文件$sFileName是什么图像决定的
2、Bitmap类是光栅图像,能实例化
也就是我们能创建Bitmap,如一系列的_GDIPlus_BitmapCreateFrom函数
$hBitmap = _GDIPlus_BitmapCreateFromFile($sFileName)
是从文件$sFileName建立Bitmap图像,即便$sFileName是Metafile矢量图像也会生成光栅图像。
3、Metafile类矢量图像
这类图像的介绍相应较少,这讲先讲他
metafile的图像文件叫做图元文件,后缀为wmf(图元文件)或者emf(增强型图元文件)
WMF:Windows 图元文件
“Windows 图元文件”是 16 位图元文件格式,可以同时包含矢量信息和位图信息。它针对 Windows 操作系统进行了优化。
EMF:增强型图元文件
“增强型图元文件”是 32 位格式,可以同时包含矢量信息和位图信息。此格式是对“Windows 图元文件格式”的改进,包含了一些扩展功能,例如,下面的功能:内置的缩放比例信息 · 与文件一起保存的内置说明 调色板和设备独立性方面的改进EMF 格式是可扩展的格式,这意味着程序员可以修改原始规范以添加功能或满足特定的需要
例子中有建立和显示
;=============建立开始==========
$hMeta = _GDIPlus_MetafileRecordFileName($myMetafile, $hDC)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hMeta)
在$hGraphics中做各种你要画的图
_GDIPlus_GraphicsDispose($hGraphics)
当_GDIPlus_GraphicsDispose($hGraphics)时图元文件建立好了
;=============建立结束==========

例子中已经有GDI中显示图元文件,GDI+中显示图元文件很简单
$hImage = _GDIPlus_ImageLoadFromFile($sFileName)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage , 区域)
就行了


#include <APIConstants.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>
#include <GDIPlusEx.au3>

Global $myMetafile = @ScriptDir & "\my.emf"
Global $hWnd = GUICreate("第十四讲 GDI+图元文件", 500, 200)
GUICtrlCreatePic("", 0, 0, 500, 200)
$hPicWnd = GUICtrlGetHandle(-1)
GUISetState()

createMetafile()
MsgBox(0, "消息", "Emf图元文件,已经创建好!" & @CR & "按确定显示图元文件!")
showMetafile()
While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        ExitLoop
        EndSwitch
WEnd
GUIDelete()
Exit

Func createMetafile()
        Local $x, $y, $w, $h, $t
        Local $hDC = _WinAPI_GetWindowDC($hWnd)
        _GDIPlus_Startup()
        $hMeta = _GDIPlus_MetafileRecordFileName($myMetafile, $hDC);获取图元文件句柄
        $hGraphics = _GDIPlus_ImageGetGraphicsContext($hMeta);建立图元文件图像的画布
        _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
        For $deg = 0 To 100
                $x = Random(0, 500, 1)
                $y = Random(0, 200, 1)
                $w = Random(0, 100, 1)
                $h = Random(0, 50, 1)
                $t = Random(0, 1, 1)
                $rgb = String("FF" & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2) & Hex(Random(0, 255, 1), 2))
                $hPen = _GDIPlus_PenCreate("0x" & $rgb)
                _GDIPlus_GraphicsDrawRect($hGraphics, $x, $y, $w, $h, $hPen)
                _GDIPlus_PenDispose($hPen)
        Next
        _GDIPlus_GraphicsDispose($hGraphics);图元文件建立结束
        _GDIPlus_Shutdown()
        _WinAPI_ReleaseDC($hWnd, $hDC)
EndFunc   ;==>createMetafile

Func showMetafile()
        Local $HWND_CX = _WinAPI_GetWindowWidth($hPicWnd)
        Local $HWND_CY = _WinAPI_GetWindowHeight($hPicWnd)
        Local $hDC = _WinAPI_GetWindowDC($hPicWnd)
        $tRect = _WinAPI_CreateRectEx(0, 0, $HWND_CX, $HWND_CY)
        $hEmf = _WinAPI_GetEnhMetaFile($myMetafile);获取图元文件句柄
        _WinAPI_PlayEnhMetaFile($hDC, $hEmf, $tRect);在矩形区域画出图元文件,按比例放大缩小的,因为是矢量图形
        _WinAPI_DeleteEnhMetaFile($hEmf);不要需要时释放
        _WinAPI_ReleaseDC($hPicWnd, $hDC)
EndFunc   ;==>showMetafile

lpxx 发表于 2013-6-9 22:39:33

每次都是那么的迫不及待的期待。

sniperone 发表于 2013-6-11 09:21:05

惯例,占座学习~~

sd23 发表于 2013-6-26 23:22:50

本帖最后由 sd23 于 2013-6-29 18:37 编辑

楼主辛苦了,太想知道gdi+绘图过程中,怎样实现不用重绘就可以实时按比例放大缩小及移动所绘图形了

******经过学习,结果用可变大小的图形对象加矩阵缩放移动 轻松实现 *******

lostcity 发表于 2014-6-16 09:55:40

太好了,正式我需要的。

yogqe3fxd 发表于 2015-6-30 12:45:00

这是百年难得一见的好贴啊!











http://www.discuz.net/static/image/common/sigline.gif
高考前十几天,查漏补缺重理解 http://www.li96.com/gaosanlizhi/6814.html
页: [1]
查看完整版本: 第十四讲 GDI+图像之图元文件