Что нового

Как создать из jpg картинок - gif анимацию

radioamator16

Чайник
Сообщения
33
Репутация
0
Версия AutoIt: 3.3.14.0

Описание:

здравствуйте.
Подскажите - можно ли как-нибудь при помощи языка автоит - сформировать из четырех картинок jpg - файл gif-анимации в окне формы ?
(Пауза между сменой картинки равна 1 секунде, после последней картинки - идет цикличный повтор.)

Видел в интернете такой бесплатный онлайн инструмент.
И возник вопрос - можно ли в автоите сделать подобный gif - файл.

Примечания:
 

Вложения

  • 6,6 КБ Просмотры: 2

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
radioamator16 [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26935.msg148405#msg148405')][?][/url_ex]
сформировать из четырех картинок jpg - файл gif-анимации в окне формы
Создать gif-файл - это одно, сделать анимацию в окне - совсем другое.
Если анимацию, то можно так
Код:
GUICreate("Anim", 112, 89)
$Pic = GUICtrlCreatePic("", 0, 0, 112, 89)
GUISetState()
Do
  For $i = 1 To 4
    GUICtrlSetImage($Pic, $i & ".jpg")
    Sleep(1000)
    If GUIGetMsg() = -3 Then Exit
  Next
Until 0
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
InnI, ясно.
Но это простая смена картинок jpg, а я спрашивал про формирование gif-файла.

В интернете висит вот такой инструмент:
icons8.com/animizer/ru/gif-apng-assembler
Я подумал, что это можно наверное и в автоите сделать.
 

Prog

Осваивающий
Сообщения
335
Репутация
31
radioamator16 [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26935.msg148423#msg148423')][?][/url_ex]
Я подумал, что это можно наверное и в AutoItе сделать.
Можно. Изучаете формат gif файла и пишите код его создающий.
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
Prog
Я имел ввиду - может кто из специалистов сталкивался с таким.
Ну вот например ссылка на скрипт, которой из видео делает gif-анимацию:
http://autoit-script.ru/index.php?topic=10868.0

Вот я поэтому и спрашиваю - может и из jpg так можно gif создать ?
 

Prog

Осваивающий
Сообщения
335
Репутация
31
radioamator16 [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26935.msg148426#msg148426')][?][/url_ex]
Ну вот например ссылка на скрипт, которой из видео делает gif-анимацию:
Там есть код.
gif функции .
Код:
_gdiplus_startup()
Global Const $__gif_tclsid = _winapi_guidfromstring(_gdiplus_encodersgetclsid("gif"))
Global Const $__gif_pclsid = DllStructGetPtr($__gif_tclsid)
Global $__gif_tgfxex, $__gif_bgfxex
Global $__gif_tappex, $__gif_bappex
_gif_initializevars()

Func _gif_createanimatedgif($sfilename, $hfirstframe, $irepeat = 0)
	Local $hgiffile = FileOpen($sfilename, 18)
	If $hgiffile = 0 Then Return SetError(1, 0, False)
	Local $pstream, $hmemory, $pmemory, $imemsize
	Local $timagedata, $bimagedata
	Local $ilow = $irepeat, $ihigh = 0
	Local $fok
	$pstream = _winapi_createstreamonhglobal()
	$fok = _gdiplus_imagesavetostream($hfirstframe, $pstream, $__gif_pclsid)
	If $fok Then
		$hmemory = _winapi_gethglobalfromstream($pstream)
		$imemsize = _memglobalsize($hmemory)
		$hmemory = _memglobalalloc($imemsize, $gmem_moveable)
		$pmemory = _memgloballock($hmemory)
		_memglobalunlock($hmemory)
		$pstream = _winapi_createstreamonhglobal($pmemory)
		_gdiplus_imagesavetostream($hfirstframe, $pstream, $__gif_pclsid)
		$timagedata = DllStructCreate("byte[" & $imemsize & "]", $pmemory)
		$bimagedata = DllStructGetData($timagedata, 1)
		_memglobalfree($hmemory)
		If $irepeat > 255 Then
			$irepeat = BitAND($irepeat, 65535)
			$ilow = BitAND($irepeat, 255)
			$ihigh = BitShift($irepeat, 8)
		EndIf
		DllStructSetData($__gif_tappex, 1, $ilow, 17)
		DllStructSetData($__gif_tappex, 1, $ihigh, 18)
		$__gif_bappex = DllStructGetData($__gif_tappex, 1)
		FileWrite($hgiffile, BinaryMid($bimagedata, 1, 781))
		FileWrite($hgiffile, $__gif_bappex)
		FileWrite($hgiffile, $__gif_bgfxex)
		FileWrite($hgiffile, BinaryMid($bimagedata, 790, BinaryLen($bimagedata) - 790))
		Return $hgiffile
	Else
		Return SetError(2, 0, False)
	EndIf
EndFunc

Func _gif_fileaddframe($hgiffile, $hframe)
	If $hgiffile = 0 Then Return SetError(1, 0, False)
	Local $pstream, $hmemory, $pmemory, $imemsize
	Local $timagedata, $bimagedata
	Local $fok
	$pstream = _winapi_createstreamonhglobal()
	$fok = _gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
	If $fok Then
		$hmemory = _winapi_gethglobalfromstream($pstream)
		$imemsize = _memglobalsize($hmemory)
		$hmemory = _memglobalalloc($imemsize, $gmem_moveable)
		$pmemory = _memgloballock($hmemory)
		_memglobalunlock($hmemory)
		$pstream = _winapi_createstreamonhglobal($pmemory)
		_gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
		$timagedata = DllStructCreate("byte[" & $imemsize & "]", $pmemory)
		$bimagedata = DllStructGetData($timagedata, 1)
		_memglobalfree($hmemory)
		FileWrite($hgiffile, $__gif_bgfxex)
		FileWrite($hgiffile, BinaryMid($bimagedata, 790, BinaryLen($bimagedata) - 790))
		Return True
	Else
		Return SetError(2, 0, False)
	EndIf
EndFunc

Func _gif_filefinalize($hgiffile)
	If $hgiffile = 0 Then Return SetError(1, 0, False)
	FileWrite($hgiffile, ";")
	FileClose($hgiffile)
	Return True
EndFunc

Func _gif_fileaddframeex($hgiffile, $hframe, ByRef $image_line)
	If $hgiffile = 0 Then Return SetError(1, 0, False)
	Local $pstream, $hmemory, $pmemory, $imemsize
	Local $timagedata, $bimagedata
	Local $fok
	$pstream = _winapi_createstreamonhglobal()
	$fok = _gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
	If $fok Then
		$hmemory = _winapi_gethglobalfromstream($pstream)
		$imemsize = _memglobalsize($hmemory)
		$hmemory = _memglobalalloc($imemsize, $gmem_moveable)
		$pmemory = _memgloballock($hmemory)
		_memglobalunlock($hmemory)
		$pstream = _winapi_createstreamonhglobal($pmemory)
		_gdiplus_imagesavetostream($hframe, $pstream, $__gif_pclsid)
		$timagedata = DllStructCreate("byte[" & $imemsize & "]", $pmemory)
		$bimagedata = DllStructGetData($timagedata, 1)
		_memglobalfree($hmemory)
		If StringLen($image_line) > 20 * 1024 * 1024 Then
			FileWrite($hfile, "0x" & $image_line)
			$image_line = ""
		EndIf
		$image_line &= StringTrimLeft($__gif_bgfxex, 2) & StringTrimLeft(BinaryMid($bimagedata, 790, BinaryLen($bimagedata) - 790), 2)
		Return True
	Else
		Return SetError(2, 0, False)
	EndIf
EndFunc

Func _gif_filefinalizeex($hgiffile, ByRef $image_line)
	If $hgiffile = 0 Then Return SetError(1, 0, False)
	FileWrite($hgiffile, "0x" & $image_line)
	FileWrite($hgiffile, ";")
	FileClose($hgiffile)
	Return True
EndFunc

Func _gif_setframedelay($idelay = 0)
	Local $ilow = $idelay, $ihigh = 0
	If $idelay > 255 Then
		$idelay = BitAND($idelay, 65535)
		$ilow = BitAND($idelay, 255)
		$ihigh = BitShift($idelay, 8)
	EndIf
	DllStructSetData($__gif_tgfxex, 1, $ilow, 5)
	DllStructSetData($__gif_tgfxex, 1, $ihigh, 6)
	$__gif_bgfxex = DllStructGetData($__gif_tgfxex, 1)
EndFunc

Func _gif_settransparentcolorentry($icolorentry = 0)
	DllStructSetData($__gif_tgfxex, 1, $icolorentry, 7)
EndFunc

Func _gif_initializevars()
	$__gif_tappex = DllStructCreate("byte[19]")
	DllStructSetData($__gif_tappex, 1, 33, 1)
	DllStructSetData($__gif_tappex, 1, 255, 2)
	DllStructSetData($__gif_tappex, 1, 11, 3)
	DllStructSetData($__gif_tappex, 1, 78, 4)
	DllStructSetData($__gif_tappex, 1, 69, 5)
	DllStructSetData($__gif_tappex, 1, 84, 6)
	DllStructSetData($__gif_tappex, 1, 83, 7)
	DllStructSetData($__gif_tappex, 1, 67, 8)
	DllStructSetData($__gif_tappex, 1, 65, 9)
	DllStructSetData($__gif_tappex, 1, 80, 10)
	DllStructSetData($__gif_tappex, 1, 69, 11)
	DllStructSetData($__gif_tappex, 1, 50, 12)
	DllStructSetData($__gif_tappex, 1, 46, 13)
	DllStructSetData($__gif_tappex, 1, 48, 14)
	DllStructSetData($__gif_tappex, 1, 3, 15)
	DllStructSetData($__gif_tappex, 1, 1, 16)
	DllStructSetData($__gif_tappex, 1, 0, 17)
	DllStructSetData($__gif_tappex, 1, 0, 18)
	DllStructSetData($__gif_tappex, 1, 0, 19)
	$__gif_tgfxex = DllStructCreate("byte[8]")
	DllStructSetData($__gif_tgfxex, 1, 33, 1)
	DllStructSetData($__gif_tgfxex, 1, 249, 2)
	DllStructSetData($__gif_tgfxex, 1, 4, 3)
	DllStructSetData($__gif_tgfxex, 1, 9, 4)
	DllStructSetData($__gif_tgfxex, 1, 25, 5)
	DllStructSetData($__gif_tgfxex, 1, 0, 6)
	DllStructSetData($__gif_tgfxex, 1, 255, 7)
	DllStructSetData($__gif_tgfxex, 1, 0, 8)
	$__gif_bappex = DllStructGetData($__gif_tappex, 1)
	$__gif_bgfxex = DllStructGetData($__gif_tgfxex, 1)
EndFunc

Func _winapi_createstreamonhglobal($hglobal = 0, $fdeleteonrelease = True)
	Local $aresult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "hwnd", $hglobal, "int", $fdeleteonrelease, "ptr*", 0)
	If @error Then Return SetError(@error, @extended, 0)
	Return SetError($aresult[0], 0, $aresult[3])
EndFunc

Func _winapi_gethglobalfromstream($pstream)
	Local $aresult = DllCall("ole32.dll", "int", "GetHGlobalFromStream", "ptr", $pstream, "ptr*", 0)
	If @error Then Return SetError(@error, @extended, 0)
	$gdip_status = $aresult[0]
	Return $aresult[2]
EndFunc
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
Prog
Ясно.
А как его запускать ?
И где прописывать адрес папки с jpg ?
 

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
radioamator16 [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26935.msg148423#msg148423')][?][/url_ex]
это простая смена картинок
Вы сейчас потратите кучу времени на создание gif-файла. Затем, такую же кучу - на отображение анимированного gif в окне. И, в результате, всё это будет выглядеть, как "простая смена картинок" ;)
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
InnI
Размещение gif-файла в окне - это малозначимый вопрос.

Самый главный вопрос - как объединить jpg файлы - в Gif-файл ?
(Даже можно не открывать этот gif, лишь бы он просто был создан)
 

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
radioamator16 [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26935.msg148435#msg148435')][?][/url_ex]
объединить jpg файлы - в Gif-файл
Код:
#include "_GDIPlus_GIFAnim.au3" ; https://www.autoitscript.com/forum/topic/168087-gifcamex/?tab=comments#comment-1231171

_GDIPlus_Startup()

Global $aImages[5] = [4]
For $i = 1 To 4
  $aImages[$i] = _GDIPlus_ImageLoadFromFile($i & ".jpg")
  If @error Then Exit MsgBox(0, _GDIPlus_Shutdown(), "Ошибка загрузки файла " & $i & ".jpg")
Next

_GDIPlus_GIFAnimCreateFile($aImages, "anim.gif", 1000)
If @error Then MsgBox(0, "Error", "Ошибка создания gif-файла")

For $i = 1 To 4
  _GDIPlus_ImageDispose($aImages[$i])
Next
_GDIPlus_Shutdown()
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
InnI
Понятно.

А как это запустить ?
Создал файл _GDIPlus_GIFAnim.au3 - заполнил содержимым по ссылке, положил его в папку со скриптом.

Запускаю ваш код - и мне выдается ошибка:

#include "_GDIPlus_GIFAnim.au3"
Error: Error opening the file
 

Вложения

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
Если вы приложили файл, который у вас в папке, то у него двойное расширение ;)
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
InnI
Да, точно.
Теперь все поправил - и выдает при запуске через консоль другую ошибку:

EndIf?
EndIf^ ERROR

А при обычном запуске выдает ошибку:

EndIf
EndIf^ ERROR
Error: Missing separator character after keyword
 

Вложения

joiner

Модератор
Локальный модератор
Сообщения
2 993
Репутация
501
radioamator16
проблема найти строку и исправить?
редактор же ясно указал на строку ошибки
Код:
EndIfп»ї
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
В коде - нет строки содержащей EndIf
 

joiner

Модератор
Локальный модератор
Сообщения
2 993
Репутация
501
в редакторе запусти проверку на ошибки
строка в библиотеке
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
joiner
Запустил проверку ошибок в редакторе.
Посмотрел строки в библиотеке.

Там нет таких команд как EndIfп , только EndIf
 

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
radioamator16
В приложенном вами _GDIPlus_GIFAnim.au3 строка 142
 
Автор
R

radioamator16

Чайник
Сообщения
33
Репутация
0
InnI а что делать с этой строкой ?
Там написано только EndIf.
Я эту команду стер и прописал с клавиатуры снова EndIf.

Но все равно не работает.
Теперь выдает ошибку:

_GDIPlus_ImageSaveAddImage($aImages[1], $aImages[$i], $tParams)
^ ERROR
 

Вложения

InnI

AutoIT Гуру
Сообщения
4 162
Репутация
1 101
radioamator16 [url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php?topic=26935.msg148461#msg148461')][?][/url_ex]
Теперь выдает ошибку
Установите последнюю версию AutoIt 3.3.14.5
 
Верх