第十四讲 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
每次都是那么的迫不及待的期待。 惯例,占座学习~~ 本帖最后由 sd23 于 2013-6-29 18:37 编辑
楼主辛苦了,太想知道gdi+绘图过程中,怎样实现不用重绘就可以实时按比例放大缩小及移动所绘图形了
******经过学习,结果用可变大小的图形对象加矩阵缩放移动 轻松实现 ******* 太好了,正式我需要的。 这是百年难得一见的好贴啊!
http://www.discuz.net/static/image/common/sigline.gif
高考前十几天,查漏补缺重理解 http://www.li96.com/gaosanlizhi/6814.html
页:
[1]