找回密码
 加入
搜索
查看: 14018|回复: 6

[交流] 第十四讲 GDI+图像之图元文件

 火.. [复制链接]
发表于 2013-6-9 21:52:45 | 显示全部楼层 |阅读模式
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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 3威望 +2 金钱 +180 贡献 +42 收起 理由
afan + 2 + 50 + 5 +
xms77 + 80 + 20 辛苦了~
lpxx + 50 + 17

查看全部评分

发表于 2013-6-9 22:39:33 | 显示全部楼层
每次都是那么的迫不及待的期待。
发表于 2013-6-11 09:21:05 | 显示全部楼层
惯例,占座学习~~
发表于 2013-6-26 23:22:50 | 显示全部楼层
本帖最后由 sd23 于 2013-6-29 18:37 编辑

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

******  经过学习,结果用可变大小的图形对象加矩阵缩放移动 轻松实现 *******
发表于 2014-6-16 09:55:40 | 显示全部楼层
太好了,正式我需要的。
发表于 2015-6-30 12:45:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-1 07:54 , Processed in 0.079633 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表