Что нового

FreeImage не работает _FreeImage_AdjustColors

nitsik

Новичок
Сообщения
4
Репутация
0
Взял Пример 1 отсюда http://autoit-script.ru/index.php/topic,446.0.html
Поменял
Код:
$hGrey = _FreeImage_ConvertToGreyscale($hImage)

на
Код:
$hGrey = _FreeImage_AdjustColors($hImage, 50.0, 15.0, 1.0, False)

Получилось
Код:
#Include <FreeImage.au3>

$sFile = 'Test.jpg'

_FreeImage_LoadDLL(@ScriptDir & '\FreeImage.dll')
_FreeImage_Initialise()

$FIF = _FreeImage_GetFileTypeU($sFile)
If $FIF = $FIF_UNKNOWN Then
    $FIF = _FreeImage_GetFIFFromFilenameU($sFile)
EndIf
$hImage = _FreeImage_LoadU($FIF, $sFile)
$hGrey = _FreeImage_AdjustColors($hImage, 50.0, 15.0, 1.0, False)
_FreeImage_SaveU($FIF, $hGrey, @ScriptDir & '\Test_Grey.jpg')
_FreeImage_Unload($hImage)
_FreeImage_Unload($hGrey)

_FreeImage_DeInitialise()

Но после запуска скрипта вылетает ошибка 'Прекращена работа программы "AutoIt v3 Script"' и, соответственно, Test_Grey.jpg получается пустым. Что я делаю не так? Исходный Пример 1 отрабатывает корректно. Заранее спасибо.
p. s. библиотеку качал по ссылке со страницы http://autoit-script.ru/index.php/topic,446.0.html
p. p. s. Скачал новую FreeImage.dll отсюда freeimage.sourceforge.net/download.html (версию win32) - все равно та же ошибка, исходный пример 1 отрабатывает так же корректно.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
nitsik
Методом "тыка" изучать UDF конечно можно, но для этого нужно много времени и нервов. Намного проще и быстрей прочитать справку и понять, что произойдёт при замене одной функции на другую.

В справке указано, что функция _FreeImage_AdjustColors() возвращает TRUE или FALSE, а не image. Поэтому и сохранять нужно не результат выполнения данной функции, а изменённый image
Код:
_FreeImage_SaveU($FIF, $hImage, @ScriptDir & '\Test_Grey.jpg')
А вылет AutoIt происходит в строке
Код:
_FreeImage_Unload($hGrey)
где идёт попытка удаления image по недействительному указателю.

В результате пример будет выглядеть так
Код:
#Include <FreeImage.au3>

$sFile = 'Test.jpg'

_FreeImage_LoadDLL(@ScriptDir & '\FreeImage.dll')
_FreeImage_Initialise()

$FIF = _FreeImage_GetFileTypeU($sFile)
If $FIF = $FIF_UNKNOWN Then
	$FIF = _FreeImage_GetFIFFromFilenameU($sFile)
EndIf
$hImage = _FreeImage_LoadU($FIF, $sFile)
;~ $hGrey = _FreeImage_ConvertToGreyscale($hImage)
_FreeImage_AdjustColors($hImage, 50.0, 15.0, 1.0, False)
_FreeImage_SaveU($FIF, $hImage, @ScriptDir & '\Test_Grey.jpg')
_FreeImage_Unload($hImage)
;~ _FreeImage_Unload($hGrey)

_FreeImage_DeInitialise()
 
Верх