Что нового

Как управлять прозрачностью PNG изображения

StarEdik

Новичок
Сообщения
365
Репутация
4
Версия AutoIt: 3.3.8.1

Описание:
Привет всем!!!
Прощу помощи при написании скрипта. :-[
При запуске скрипта загружается изображение типа PNG. Надо добиться прозрачности этого изображения, чтоб через это изображения было возможность писать и редактировать текст в текстовом редакторе. Но не прозрачность PNG изображения мешает ходу работ. Нужно как то управлять прозрачностью. То есть, форма должна быть полностью прозрачная(она прозрачна), а прозрачностью изображения можно было бы манипулировать (+/-). Я не могу этого добиться. Может вы знаете как это сделать.

За ранее благодарю.
А вот и скрипт.
Код:
#Include <GDIPlus.au3>
#Include <Pop-ups.au3>

Opt('TrayAutoPause', 0)
Run('notepad.exe')
_GDIPlus_Startup()
$hPng = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Zerkalo1.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
_GDIPlus_ImageDispose($hPng)

_GDIPlus_Shutdown()

$hPopup = _Popup_Register()

HotKeySet('{F1}', '_Popup')
HotKeySet('{Esc}', '_Exit')

While 1                                                                     
    Sleep(1000)
WEnd
                                 
Func _Popup()
      _Popup_Show($hPopup, $hBitmap, 0, -1, -1, -100, 20)
	  ;_Popup_Show($hPopup, $hBitmap, 0, MouseGetPos(0) + 72, MouseGetPos(1) + 7, -100, 20)
EndFunc   ;==>_Popup            
 
 Func _Exit()
    Exit
 EndFunc   ;==>_Exit
Примечания:
Изображения только в формате PNG
Файл для тестирования прилогается. Надо писать и редактировать в зеркале
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как в прозрачном окне управлять прозрачностью PNG изображения

Если загрузит JPG, то с помощью WinSetTrans получается манипулировать прозрачностью файла JPG. Но фон у JPG не прозрачно.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <GDIP.au3>
#Include <Pop-ups.au3>

Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

Global $hPopup, $hPng, $hBitmap, $Alpha = 255

_GDIPlus_Startup()

$hPng = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Zerkalo1.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)

$hPopup = _Popup_Register()

HotKeySet('{F1}', '_Popup')
HotKeySet('{Esc}', '_Exit')
HotKeySet('+{+}', '_UpDown')
HotKeySet('+{-}', '_UpDown')

While 1
	Sleep(1000)
WEnd

Func _Popup()
	_Popup_Show($hPopup, $hBitmap, 0, -1, -1, -1, 20)
EndFunc   ;==>_Popup

Func _Exit()
	_GDIPlus_Shutdown()
	Exit
EndFunc   ;==>_Exit

Func _UpDown()

	Local $hTemp

	Switch @HotKeyPressed
		Case '+{+}'
			If $Alpha = 255 Then
				Return
			EndIf
			$Alpha += 5
			If $Alpha > 255 Then
				$Alpha = 255
			EndIf
		Case '+{-}'
			If $Alpha = 5 Then
				Return
			EndIf
			$Alpha -= 5
			If $Alpha < 5 Then
				$Alpha = 5
			EndIf
		Case Else

	EndSwitch
	$hTemp = _CreateAlphaBitmap($hPng, $Alpha)
	_WinAPI_DeleteObject($hBitmap)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hTemp)
	_GDIPlus_ImageDispose($hTemp)
	If _Popup_IsActive($hPopup) Then
		_Popup()
	EndIf
EndFunc   ;==>_UpDown

Func _CreateAlphaBitmap($hImage, $iAlpha, $fDelete = 0)

	Local $hGraphics, $hResult = 0, $hIA, $tCM, $aSize

;~	_GDIPlus_Startup()
	Do
		$aSize = _GDIPlus_ImageGetDimension($hImage)
		If Not IsArray($aSize) Then
			ExitLoop
		EndIf
		$hIA = _GDIPlus_ImageAttributesCreate()
		$tCM = _GDIPlus_ColorMatrixCreateScale(1, 1, 1, $iAlpha / 255)
		_GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, 1, DllStructGetPtr($tCM))
		$hResult = _GDIPlus_BitmapCreateFromScan0($aSize[0], $aSize[1])
		$hGraphics = _GDIPlus_ImageGetGraphicsContext($hResult)
		_GDIPlus_GraphicsDrawImageRectRectIA($hGraphics, $hImage, 0, 0, $aSize[0], $aSize[1], 0, 0, $aSize[0], $aSize[1], $hIA)
		_GDIPlus_ImageAttributesDispose($hIA)
		_GDIPlus_GraphicsDispose($hGraphics)
		If ($hResult) And ($fDelete) Then
			_GDIPlus_ImageDispose($hImage)
		EndIf
	Until 1
;~	_GDIPlus_Shutdown()
	Return $hResult
EndFunc   ;==>_CreateAlphaBitmap


Необходима GDIP UDF (лучше скачать последнюю версию с оффициального сайта).
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Yashied
Спасибо за помощь. Хороший пример.
Но в скрипте не выполняется условие.

StarEdik
Надо добиться прозрачности этого изображения, чтоб через это изображения было возможность писать и редактировать текст в текстовом редакторе.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Всплывающие окна фокус на себя не берут, и можно продолжать редактировать текст.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Yashied
Посмотрите, пожалуйста, на этот скрипт. Здесь загружается .jpg файл. (файл прилагается)
Прозрачность окна -80 (к примеру). Запустите и прокрутите мышкой, пока под jpg файлом будут видны комментированные строчки. Внутри этой картинки свободно можно редактировать то, что под ней и даже на Photoshop-е спокойно можно работать. (Хотя мешает фон GUI под картинкой) Вот этот эффект нужно сделать и с PNG файлами.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
HotKeySet('{Esc}', '_Exit')
$Form1 = GUICreate('My GUI', -1, -1, -1, -1, $WS_POPUP, BitOR($WS_EX_TRANSPARENT, $WS_EX_TOPMOST), $WS_EX_TOOLWINDOW)
$Pic1 = GUICtrlCreatePic(@ScriptDir & '\JpgImg.jpg', -1, -1, 317, 356)
GUISetState(@SW_SHOW)
WinSetTrans($Form1, '', 80)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _Exit()
    Exit
 EndFunc   ;==>_Exit
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhghjghjgjhjgjfhgfhgfhgfhhgfhgfghfgh
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhghjghjgjhjgjfhgfhgfhgfhhgfhgfghfgh
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhghjghjgjhjgjfhgfhgfhgfhhgfhgfghfgh
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhghjghjgjhjgjfhgfhgfhgfhhgfhgfghfgh
;                             hgfhgfgfhfghfghfghhfghfhghgfhgfhgfhgfhgfhgfhgfhhgfhgfghfghfghfffff
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я понял, что вы хотите.

:smile:

Pop-ups.au3, строка 241. Добавьте стиль $WS_EX_TRANSPARENT. Должно быть так:

Код:
$ppData[$ppData[0][0] + 1][0] = GUICreate('', -1, -1, -1, -1, BitOR($WS_DISABLED, $WS_POPUPWINDOW), BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TRANSPARENT), $ppData[0][1])
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
ИМХО, Вам нужна не прозрачность PNG изображения, а проницаемость окна с изображением. Поправьте, пожалуйста, название темы.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Yashied
Да, это вы сделали. Вам спасибо БОЛЬШОЕ от всех кому нужен будет этот скрипт. :ok: :IL_AutoIt_1:
Премного благодарен.

madmasles
Хотел поправить, но получил ошибку. :-[
Wrong value type sent to the database. Array of integers expected. (attachment_list)
 
Верх