개발 관련/SW, App 관련

Autoit의 PNG를 이용한 투명 이미지 활용하기

소서리스25 2023. 6. 12. 19:07
반응형

Autoit의 PNG를 이용한 투명 이미지를 GUI에 활용하기

 

Autoit의 경우 GUI에 PNG를 이용하여 투명 이미지를 적용할 수 있다.

이것을 어느 때에 사용하는가 하면, 가량 이미지 위에 또 다른 이미지를 덧 씌울 때, GUI 위에 다른 이미지를 덧씌울 때, 또는 여러 투명도를 가진 PNG를 겹쳐서 하나의 이미지를 완성할 때이다.

나의 경우는 전시물에서 웹카메라로 영상을 입력받는 상태에서 초점을 맞추는데 이용하였다.

이번 샘플은 그러한 것을 해보는 것이다.

 

준비된 투명도를 가진 PNG 이미지는 다음과 같다.

투명도를 가진 PNG 이미지

 

그리고 Autoit에서는 WinAPI와 그래픽을 다루는 GDI를 활용해서 적용해야 한다. 이를 적용해 주는 것이 WinAPI.au3과 GDIPlus.au3를 포함시켜서 적용하면 된다. 해당 함수를 활용한 적용 샘플 예제는 Autoit에서 제공하고 있으니 이를 활용하면 손쉽게 이용할 수 있다. 응용의 경우 기본적으로 해당 함수를 활용하면 되겠다. 

따라서 이를 활용한 아래와 같은 코드로 간략하게 구성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
 
Opt("MustDeclareVars"0)
 
Global Const $AC_SRC_ALPHA = 1
 
Global $hGUI, $hImage
 
$hGUI = GUICreate("Test"00'', '', -1, BitOR( $WS_EX_LAYERED, $WS_EX_TOPMOST))
 
 
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile("cir_line.png")
 
SetBitMap($hGUI, $hImage, 255)
 
GUISetState()
 
 
while 1
 
    $nMSG = GUIGetMsg();
 
   switch $nMSG
        case $GUI_EVENT_CLOSE;
            _GDIPlus_ImageDispose($hImage);
            _GDIPlus_Shutdown();
            Exit;
   EndSwitch
 
    sleep(10);
WEnd
 
 
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
cs

 

현재 것을 실행하면 해당 이미지가 윈도우 창의 최상위로 떠서 투명도를 가진 GUI로 실행되는 것을 확인할 수 있다.

최종 프로그램이 적용된 결과를 확인해 보면 아래와 같이 나타난다.

최종 실행 결과 화면
최종 실행 결과 화면

 

반응형