Что нового

Анимация Png

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Всем привет :smile:

У меня есть картинка(Ниже расположенна)
Нужно ее программно разрезать и воспроизвести :smile:
Зарание спс :smile:

Воспроивести нужно НЕ в GUI, а просто на рабочем столе с прозрачностью :smile:
 

nu3dell

Осваивающий
Сообщения
139
Репутация
24
так что ли?
249851.gif
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Да :laugh:, только програмно резать, и выводить с прозрачностью прямо на рабочий стол(Прозрачный гуй, ну или что-то наподоби)


Добавлено:
Сообщение автоматически объединено:

Ну хотяб програмно резать и куда нибудь выводить... :smile:
 

nu3dell

Осваивающий
Сообщения
139
Репутация
24
так вы посмотрите C:\Program Files\AutoIt3\Examples\GUI\Advanced\AlphaBlend.au3 там используеться gui с картиной короче то что вам надо
только удалите там, это вам не понадобиться
Код:
$hGUI1 = GUICreate("Alpha Blend", 400, 100)
$iLabel1 = GUICtrlCreateLabel ("Adjust slider to change opacity level: (0-255)", 84, 10, 380, 20)
$iSlider = GUICtrlCreateSlider(10, 32, 380, 40)
$iLabel2 = GUICtrlCreateLabel ("Drag the layered window around your desktop"   , 80, 74, 380, 20)
GUICtrlSetLimit($iSlider, 255, 0)
GUICtrlSetData ($iSlider, 255)
GUISetState()
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Я знаю что функции:
_GDIPlus... Или что-то наподоби могут резать картинку...
Только как?


Добавлено:
Сообщение автоматически объединено:

Все сделал :smile:
Код:
#include <GDIPlus.au3>

Poof()

Func Poof()
	_GDIPlus_Startup()
	$PPNG = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Poof.png")
	Local $SGUI = GUICreate("UL Poof", 128, 128, MouseGetPos(0) - 60, MouseGetPos(1) - 60, BitOR(0x80000000, 0x08000000), BitOR(0x00080000, 0x00000008), 0x80)
	GUISetState(@SW_SHOWNOACTIVATE, $SGUI)
	For $i = 1 To 5
		$Poof = _GDIPlus_BitmapCloneArea($PPNG, 0, ($i - 1) * 128, 128, 128, 0x0026200A)
		SetBmp($SGUI, $Poof)
		_GDIPlus_ImageDispose($Poof)
		Sleep(35)
	Next
	GUIDelete($SGUI)
EndFunc   ;==>Poof

Func SetBmp($hGUI, $hImage, $iOpacity = 255)
    Local $hScrDC = _WinAPI_GetDC(0)
	Local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
	Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    Local $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("long X;long Y")
	$pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
	$tSource = DllStructCreate("long X;long Y")
	$pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
	$pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 0x02)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBmp
 

Yashied

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

Opt('TrayMenuMode', 1)

Global Const $hAutoIt = WinGetHandle(AutoItWinGetTitle())

; Загружаем библиотеку GDI+
_GDIPlus_Startup()

; Загружаем изображение
$hPng = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Poof.png')

; Определяем количество кадров, ширина и высота кадра должны быть равны
$Size = _GDIPlus_ImageGetDimension($hPng)
If @error Then
	Exit
EndIf
$Count = $Size[1] / $Size[0]
If Not IsInt($Count) Then
	Exit
EndIf

; Разрезаем картинку на кадры и создаем массив из указателей на GDI битмапы (DDB) для последующей анимации
Dim $hBitmap[$Count]
For $i = 0 To $Count - 1
	$hImage = _GDIPlus_BitmapCloneArea($hPng, 0, $Size[0] * $i, $Size[0], $Size[0], $GDIP_PXF32ARGB)
	$hBitmap[$i] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_ImageDispose($hImage)
Next

; Освобождаем ресурсы GDI+
_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()

; Создаем GUI для анимации, родительское окно - скрытое окно AutoIt (для подавления появления иконки окна в TaskBar'е)
$hPopup = GUICreate('', -1, -1, -1, -1, BitOR($WS_DISABLED, $WS_POPUPWINDOW), BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), $hAutoIt)

$Exit = TrayCreateItem('Exit')

; Выводим анимированное изображение при нажатии средней клавиши мыши
Do
	If _IsPressed('01') Then
		_Animate()
	EndIf
Until TrayGetMsg() = $Exit

Func _Animate()

	Local $Pos, $Reset, $Timer

	GUISetState(@SW_SHOWNOACTIVATE, $hPopup)
	While 1
		$Pos = MouseGetPos()
		For $i = 0 To 1
			$Pos[$i] -= $Size[0] / 2
		Next
		$Reset = 0
		For $i = 0 To $Count - 1
			_WinAPI_UpdateLayeredWindowEx($hPopup, $Pos[0], $Pos[1], $hBitmap[$i])
			$Timer = TimerInit()
			Do
				If _IsPressed('01') Then
					If $Reset Then
						ContinueLoop 3
					EndIf
				Else
					$Reset = 1
				EndIf
			Until TimerDiff($Timer) > 100
		Next
		ExitLoop
	WEnd
	_WinAPI_UpdateLayeredWindowEx($hPopup, -1, -1, 0, 0)
	GUISetState(@SW_HIDE, $hPopup)
	While _IsPressed('01')
		Sleep(10)
	WEnd
EndFunc   ;==>_Animate

#Region GDI+ Functions

Func _GDIPlus_ImageGetDimension($hImage)

	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hImage, 'float*', 0, 'float*', 0)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $Ret[0] Then
			Return SetError(1, $Ret[0], 0)
		EndIf
	EndIf

	Local $Result[2]

	$Result[0] = $Ret[2]
	$Result[1] = $Ret[3]

	Return $Result
EndFunc   ;==>_GDIPlus_ImageGetDimension

#EndRegion GDI+ Functions
 
Верх