[已解决]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楼 效果非常棒,不错 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
效果不错呀 本帖最后由 netegg 于 2013-2-28 05:02 编辑
win8的效果不清楚,_WinAPI_AlphaBlend试试,还有dwm*
另外,这看着不像gdi的活儿 回复 5# netegg
我想GDI应该可以的,我转了一下思路想这会不会跟水印很像(但大多水印都是直接在Graphics上绘画不带alpha的,唉,不管啦),在论坛找了一些有关水印的帖子
图像加水印 17 号更新版
发现GDI真的可以实现的,例子里的主函数
_GDIPlus_StampImage ()
负责起作用的其它几个子函数
_GDIPlus_ColorMatrixCreateTranslate () ;这个本人理解为用作修改透明色的
_GDIPlus_ImageAttributesSetColorMatrix() ;这个本人理解为用作修改透明色的
_GDIPlus_GraphicsDrawImageRectRectIA() ;这个本人理解为用作返回绘画带有上面修改透明色的绘画
然后再用_GDIPlus_GraphicsDrawImageRect()绘画重叠两个图像
回复 5# netegg
不好意思蛋兄,我图中的VMware是随便截的图,误导了不好意思
页:
[1]