xdcysten 发表于 2013-2-26 11:35:31

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

本帖最后由 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 http://www.autoitx.com/images/common/back.gif


解决方案 #6楼

weeks1 发表于 2013-2-27 09:30:45

效果非常棒,不错

xdcysten 发表于 2013-2-27 11:10:08

API 可以实现对窗口修改的透明度(类似这样的效果),找谝了官网也没有找到 关于GDIPlus 绘画时如何能改变上层Graphics的透明度 的 例子(可能是人笨吧{:face (394):} )
望那些使用过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

huangwei 发表于 2013-2-27 21:32:14

效果不错呀

netegg 发表于 2013-2-28 05:01:37

本帖最后由 netegg 于 2013-2-28 05:02 编辑

win8的效果不清楚,_WinAPI_AlphaBlend试试,还有dwm*
另外,这看着不像gdi的活儿

xdcysten 发表于 2013-3-1 11:30:43

回复 5# netegg

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

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

_GDIPlus_StampImage ()

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

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

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

xdcysten 发表于 2013-3-1 11:33:11

回复 5# netegg

不好意思蛋兄,我图中的VMware是随便截的图,误导了不好意思
页: [1]
查看完整版本: [已解决]GDIPlus 绘画时如何能改变上层Graphics的透明度