找回密码
 加入
搜索
查看: 14068|回复: 15

[图形处理] _GDIPlus_GraphicsDrawImage 这个函数理解不来! (已经解决!)

 火.. [复制链接]
发表于 2010-8-9 11:45:51 | 显示全部楼层 |阅读模式
本帖最后由 yiruirui 于 2010-8-11 13:13 编辑

最近看AU3论坛中的一些源码,翻译虽然是中文的,但是仍然理解不来什么意思.请大家帮忙分析分析.谢谢了先!
有个函数定义:
Global Const $NormalImage_Small = _ResizeBitmap(@TempDir & "\normal.png", 118, 53)

Func _ResizeBitmap($sFile, $newW, $newH)
        Local $oldImage, $GC, $newBmp, $newGC

        ; 加载图像
        $oldImage = _GDIPlus_ImageLoadFromFile($sFile)

        ;创建新图像
        $GC = _GDIPlus_ImageGetGraphicsContext($oldImage)
        $newBmp = _GDIPlus_BitmapCreateFromGraphics($newW, $newH, $GC)
        $newGC = _GDIPlus_ImageGetGraphicsContext($newBmp)

        ;绘制
        _GDIPlus_GraphicsDrawImageRect($newGC, $oldImage, 0, 0, $newW, $newH)

        ;Clenaup
        _GDIPlus_GraphicsDispose($GC)
        _GDIPlus_GraphicsDispose($newGC)
        _GDIPlus_ImageDispose($oldImage)
        Return $newBmp
EndFunc   ;==>_ResizeBitmap
真的很吃力,我有帮助文档的.请大家帮忙理解一下这个函数有什么用呢?谢谢!

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-8-9 14:37:27 | 显示全部楼层
_GDIPlus_ImageGetGraphicsContext   获取图象的图形场景

_GDIPlus_BitmapCreateFromGraphics     创建基于Graphics对象, 宽度和高度的Bitmap对象

_GDIPlus_GraphicsDrawImageRect         在指定位置绘制图象

$hGraphics 图形对象句柄              //就是这里不太明白,图形句柄和图象句柄是什么关系?
                                                         //在这里图形和图象的关系是什么,区别呢?
$hImage 图像对象句柄
$iX 经过渲染的图像的左上角X坐标
$iY 经过渲染的图像的左上角Y坐标
$iW 指定绘制图像的目标矩形的宽度
$iH 指定绘制图像的目标矩形的高度


谢谢!
 楼主| 发表于 2010-8-9 17:57:49 | 显示全部楼层
等了老半天,没人回答?是没人会?还是没人愿意理会?
肯定有人用过的,希望能够理解的去用,不要抄袭或者模仿,毫无意义!
发表于 2010-8-9 23:03:24 | 显示全部楼层
没办法,不懂不敢回复,帮你顶上去吧
 楼主| 发表于 2010-8-10 11:21:59 | 显示全部楼层
一天了,真失败!高手出来!
发表于 2010-8-10 13:16:59 | 显示全部楼层
不懂,帮你顶上去先
发表于 2010-8-10 13:56:18 | 显示全部楼层
图形是指像素范围,图像是像素数据,个人理解…
发表于 2010-8-10 14:35:37 | 显示全部楼层
本帖最后由 C.L 于 2010-8-10 14:38 编辑

OK,我们用帮助文件中的例子来打个比方来说明,可能不是太专业,但能够说得明白就好:

我们要画一幅画,有以下几个步骤:
1、要有参照物(要画的东西或景)
2、根据参照物在脑中构想成一个成形的图片里的各种元素
3、还要在某个地方要有一个画板,将你的构想画在画板上

按照这个思路,我们看一下帮助里面的例子,我做了一些注释:
#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>

Opt('MustDeclareVars', 1)

_Main()

Func _Main()
    Local $hBitmap1, $hBitmap2, $hImage1, $hImage2, $hGraphic

    ; Initialize GDI+ library; 初始化GDI+库
    _GDIPlus_Startup ()

    ; Capture full screen  ; 捕捉屏幕 ,到时作为画板的底图,也就是做为画板
    $hBitmap1 = _ScreenCapture_Capture ("");位图信息,原始的参照物
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap1);从位图句柄创建Bitmap对象,通过这个对象对位图进行操作,或者理解为图片构成的一个元素

    ; Capture screen region ; 捕捉屏幕左上角
    $hBitmap2 = _ScreenCapture_Capture ("", 0, 0, 400, 300);位图信息,原始的参照物
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap2);从位图句柄创建Bitmap对象,通过这个对象对位图进行操作,或者理解为图片构成的一个元素

    ; Draw one image in another; 将一个图绘制到另一个图像中,也就是将$hImage2 绘到画板上。
    $hGraphic = _GDIPlus_ImageGetGraphicsContext ($hImage1);获取图像的场景,也就是定义画板,这个画板在什么地方,用什么来构成,不单止是用Bitmap对象,也可以是GUI对象来设置画板。
        ;在这个例子中,对这个$hGraphic操作,实际上是对$hImage1的副本进行操作

    _GDIPlus_GraphicsDrawImage ($hGraphic, $hImage2, 100, 100);将$hImage2 操作的元素画到画板的指定位置
        ;有了画板$hGraphic,我们就可以在画板上画图了

    ; Draw a frame around the inserted image;在插入的图像周围画个边框
    _GDIPlus_GraphicsDrawRect ($hGraphic, 100, 100, 400, 300)

    ; Save resultant image;保存图像
    _GDIPlus_ImageSaveToFile ($hImage1, "GDIPlus_Image.jpg")

    ; Clean up resources
    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_ImageDispose ($hImage2)
    _WinAPI_DeleteObject ($hBitmap1)
    _WinAPI_DeleteObject ($hBitmap2)

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()

EndFunc   ;==>_Main
不知道这样说明是否说得够明白?

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
afan + 20 + 2

查看全部评分

发表于 2010-8-10 15:11:22 | 显示全部楼层
好了,在上面已经理解的基础上,我们可以将画板定义为AU3自身建立的GUI界面,跟我来一步一步的实现:
1、建立一个GUI
增加以下代码:
#include <GuiConstantsEx.au3>
Dim $form1
$form1 = GUICreate("test", 600, 500)
GUISetState()
_Main()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
这样,一个空的GUI就建好了,这个GUI的句柄是:$form1, 下面就可以通过这个句柄来定义画板了

2、改写下面这句代码:
$hGraphic = _GDIPlus_ImageGetGraphicsContext ($hImage1);
改为:
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($form1)
OK,这样就将这个空的GUI作为一个画板了,在上面画你想画的东西吧~~

下面的代码是将捕捉屏幕左上角的图片画到GUI中:
#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>

Opt('MustDeclareVars', 1)
Dim $form1
$form1 = GUICreate("GDI+", 600, 500)
GUISetState()
_Main()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _Main()
    Local $hBitmap1, $hBitmap2, $hImage1, $hImage2, $hGraphic

    ; Initialize GDI+ library; 初始化GDI+库
    _GDIPlus_Startup ()

    ; Capture full screen  ; 捕捉屏幕 ,到时作为画板的底图,也就是做为画板
    $hBitmap1 = _ScreenCapture_Capture ("");位图信息,原始的参照物
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap1);从位图句柄创建Bitmap对象,通过这个对象对位图进行操作,或者理解为图片构成的一个元素

    ; Capture screen region ; 捕捉屏幕左上角
    $hBitmap2 = _ScreenCapture_Capture ("", 0, 0, 400, 300);位图信息,原始的参照物
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap2);从位图句柄创建Bitmap对象,通过这个对象对位图进行操作,或者理解为图片构成的一个元素

    ; Draw one image in another; 将一个图绘制到另一个图像中,也就是将$hImage2 绘到画板上。
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($form1);获取图像的场景,也就是定义画板,这个画板在什么地方,用什么来构成,不单止是用Bitmap对象,也可以是GUI对象来设置画板。
        ;在这个例子中,将画板改为GUI的句柄$form1,将GUI做为画板

    _GDIPlus_GraphicsDrawImage ($hGraphic, $hImage2, 100, 100);将$hImage2 操作的元素画到画板的指定位置
        ;有了画板$hGraphic,我们就可以在画板上画图了

    ; Draw a frame around the inserted image;在插入的图像周围画个边框
    _GDIPlus_GraphicsDrawRect ($hGraphic, 100, 100, 400, 300)

   ; Save resultant image;保存图像
    _GDIPlus_ImageSaveToFile ($hImage1, "GDIPlus_Image.jpg")

    ; Clean up resources
    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_ImageDispose ($hImage2)
    _WinAPI_DeleteObject ($hBitmap1)
    _WinAPI_DeleteObject ($hBitmap2)

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()

EndFunc   ;==>_Main

评分

参与人数 1威望 +2 金钱 +50 贡献 +2 收起 理由
afan + 2 + 50 + 2 可以作为教材资料了

查看全部评分

 楼主| 发表于 2010-8-10 18:03:11 | 显示全部楼层
回复 9# C.L


    感谢!再次感谢您的理解!教科书般的理解!佩服!
发表于 2010-11-22 04:18:02 | 显示全部楼层
教课书般的理解!!!!!!!!谢谢CL
发表于 2010-11-22 05:18:10 | 显示全部楼层
简单解释下,不一定对,图形是有边界的,图像是没有边界的(如果非要把颜色不同之处算为边界的话,就随便理解吧)
发表于 2011-9-1 23:15:21 | 显示全部楼层
感谢C.L的解释,终于对GDI的函数有点了解啦!
发表于 2011-9-18 22:11:51 | 显示全部楼层
精彩范例,值得再读一次
发表于 2012-10-30 18:18:28 | 显示全部楼层
高手如云啊
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 14:59 , Processed in 0.092015 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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