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

[图形处理] [已解决]GDIPlus 绘画时如何能改变上层Graphics的透明度

  [复制链接]
发表于 2013-2-26 11:35:31 | 显示全部楼层 |阅读模式
本帖最后由 xdcysten 于 2013-3-1 13:57 编辑

GDIPlus 绘画时如何才能改变上层Graphics的透明度呢, 只知道SetBitmap可以修改窗口的透明度,效果如下图:


#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>

_Main()

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

    ; 初始化 GDI+ 库
    _GDIPlus_Startup()

    ; 捕获整个屏幕
    $hBitmap1 = _ScreenCapture_Capture("")
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap1)

    ; 捕获屏幕区域
    $hBitmap2 = _ScreenCapture_Capture("", 0, 0, 400, 300)
    $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap2)

    ; 在一幅图像上描绘另一幅图像
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage2, 100, 100, 400, 300)

    ; 在插入的图像周围描绘边框
    _GDIPlus_GraphicsDrawRect($hGraphic, 100, 100, 400, 300)

    ; 保存由此产生的图像
    _GDIPlus_ImageSaveToFile($hImage1, @MyDocumentsDir & "\GDIPlus_Image.jpg")

    ; 清理资源
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _WinAPI_DeleteObject($hBitmap1)
    _WinAPI_DeleteObject($hBitmap2)

    ; 关闭 GDI+ 库
    _GDIPlus_Shutdown()

EndFunc   ;==>_Main




API 可以实现对窗口修改的透明度(类似这样的效果),找谝了官网也没有找到 关于GDIPlus 绘画时如何能改变上 ...
xdcysten 发表于 2013-2-27 11:10



解决方案 #6楼

本帖子中包含更多资源

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

×
发表于 2013-2-27 09:30:45 | 显示全部楼层
效果非常棒,不错
 楼主| 发表于 2013-2-27 11:10:08 | 显示全部楼层
API 可以实现对窗口修改的透明度(类似这样的效果),找谝了官网也没有找到 关于GDIPlus 绘画时如何能改变上层Graphics的透明度 的 例子(可能是人笨吧
望那些使用过GDIPlus绘画界面的前辈们、高手们指点一二

Func SetBitmap($hGUI, $hImage, $iOpacity)
        Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
        $hScrDC = _WinAPI_GetDC(0)
        $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
        $tSize = DllStructCreate($tagSIZE)
        $pSize = DllStructGetPtr($tSize)
        DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
        DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
        $tSource = DllStructCreate($tagPOINT)
        $pSource = DllStructGetPtr($tSource)
        $tBlend = DllStructCreate($tagBLENDFUNCTION)
        $pBlend = DllStructGetPtr($tBlend)
        DllStructSetData($tBlend, "Alpha", $iOpacity)
        DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
        _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        _WinAPI_ReleaseDC(0, $hScrDC)
        _WinAPI_SelectObject($hMemDC, $hOld)
        _WinAPI_DeleteObject($hBitmap)
        _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
发表于 2013-2-27 21:32:14 | 显示全部楼层
效果不错呀
发表于 2013-2-28 05:01:37 | 显示全部楼层
本帖最后由 netegg 于 2013-2-28 05:02 编辑

win8的效果不清楚,_WinAPI_AlphaBlend试试,还有dwm*
另外,这看着不像gdi的活儿
 楼主| 发表于 2013-3-1 11:30:43 | 显示全部楼层
回复 5# netegg

我想GDI应该可以的,我转了一下思路想这会不会跟水印很像(但大多水印都是直接在Graphics上绘画不带alpha的,唉,不管啦),在论坛找了一些有关水印的帖子

图像加水印 17 号更新版
发现GDI真的可以实现的,例子里的主函数

 _GDIPlus_StampImage ()

负责起作用的其它几个子函数

_GDIPlus_ColorMatrixCreateTranslate () ;这个本人理解为用作修改透明色的
_GDIPlus_ImageAttributesSetColorMatrix() ;这个本人理解为用作修改透明色的
_GDIPlus_GraphicsDrawImageRectRectIA() ;这个本人理解为用作返回绘画带有上面修改透明色的绘画

然后再用_GDIPlus_GraphicsDrawImageRect()绘画重叠两个图像

本帖子中包含更多资源

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

×
 楼主| 发表于 2013-3-1 11:33:11 | 显示全部楼层
回复 5# netegg

不好意思蛋兄,我图中的VMware是随便截的图,误导了不好意思
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-19 15:35 , Processed in 0.079790 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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