Что нового

FreeImage - Мощная графическая библиотека

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AutoIt: 3.3.0.0
Версия: N/A

Категория: Графика / GDI+

Описание: FreeImage - это свободно-бесплатная мощная графическая библиотека. Нет смысла перечислять все ее возможности, достаточно только заглянуть в документацию (на английском) и станет ясно, что это действительно очень мощный материал в помощь кодеру. Да, документация на первый взгляд достаточно сложная для изучения, но оно, поверьте, того стоит. Для начала посмотрите на приведенные ниже примеры (они очень простые и доступные) и используйте их как старт для дальнейших экспериментов с этой библиотекой. Попробуйте поиграться с функциями для разных эффектов, конвертаций и т.д.

Файл(ы): FreeImage.zip

Пример 1:
Код:
#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_SaveU($FIF, $hGrey, @ScriptDir & '\Test_Grey.jpg')
_FreeImage_Unload($hImage)
_FreeImage_Unload($hGrey)

_FreeImage_DeInitialise()

Пример 2:
Код:
#Include <FreeImage.au3>

Global $ImageHandle = -1, $WorkingFileName, $FIF

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

GUICreate('FreeImage Test GUI', 800, 700)
$ShowPic = GUICtrlCreatePic('', 0, 0, 800, 600)

$btnOpen = GUICtrlCreateButton('Choose File', 10, 610, 100, 30)
GUICtrlSetTip(-1, 'Only a copy of the image will be used')

$btnFlipH = GUICtrlCreateButton('Flip Horizontal', 120, 610, 100, 30)
$btnFlipV = GUICtrlCreateButton('Flip Vertical', 230, 610, 100, 30)
$btnRotate = GUICtrlCreateButton('Rotate ...', 340, 610, 100, 30)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case - 3
			Exit
		Case $btnOpen
			_OpenImage()
		Case $btnFlipH
			If $ImageHandle <> -1 Then
				_FreeImage_FlipHorizontal($ImageHandle)
				_FreeImage_SaveU($FIF, $ImageHandle, $WorkingFileName)
				_ShowImage()
			EndIf
		Case $btnFlipV
			If $ImageHandle <> -1 Then
				_FreeImage_FlipVertical($ImageHandle)
				_FreeImage_SaveU($FIF, $ImageHandle, $WorkingFileName)
				_ShowImage()
			EndIf
		Case $btnRotate
			If $ImageHandle <> -1 Then
				$hImageNew = _FreeImage_RotateClassic($ImageHandle, Number(InputBox('Rotate', 'angle for rotation', 90)))
				_FreeImage_SaveU($FIF, $hImageNew, $WorkingFileName)
				_FreeImage_Unload($ImageHandle)
				$ImageHandle = $hImageNew
				_ShowImage()
			EndIf
	EndSwitch
WEnd

Func _OpenImage()
	Local $sFile = FileOpenDialog('Choose Image', '', 'Image Files (*.jpg;*.jpeg;*.bmp;*.gif)', 3)
	If @error Then Return
	If $ImageHandle <> -1 Then _FreeImage_Unload($ImageHandle)
	Local $dot = StringInStr($sFile, '.', 1, -1)
	Local $Name = StringLeft($sFile, $dot - 1)
	Local $Ext = StringMid($sFile, $dot)
	$WorkingFileName = $Name & '_FI4AU3' & $Ext
	FileCopy($sFile, $WorkingFileName)
	$FIF = _FreeImage_GetFileTypeU($WorkingFileName)
	If $FIF = $FIF_UNKNOWN Then
		$FIF = _FreeImage_GetFIFFromFilenameU($WorkingFileName)
	EndIf
	$ImageHandle = _FreeImage_LoadU($FIF, $sFile)
	_ShowImage()
EndFunc   ;==>_OpenImage

Func _SizeProportional(ByRef $Width, ByRef $Height, $WDesired, $HDesired, $WSrc, $HSrc)
	; Prog@ndy
	Local $RatioDes = ($WDesired / $HDesired)
	Local $CurrentRatio = ($WSrc / $HSrc)

	If $CurrentRatio > $RatioDes Then ; scale height
		$Width = $WDesired
		$Height = $WDesired / $CurrentRatio
	Else ; scale width
		$Width = $HDesired * $CurrentRatio
		$Height = $HDesired
	EndIf

EndFunc   ;==>_SizeProportional

Func _ShowImage()
	Local $Width, $Height
	_SizeProportional($Width, $Height, 800, 600, _FreeImage_GetWidth($ImageHandle), _FreeImage_GetHeight($ImageHandle))
	GUICtrlSetPos($ShowPic, 0, 0, $Width, $Height)
	GUICtrlSetImage($ShowPic, $WorkingFileName)
EndFunc   ;==>_ShowImage

Func OnAutoItExit()
	If $ImageHandle <> -1 Then _FreeImage_Unload($ImageHandle)
	_FreeImage_DeInitialise()
EndFunc   ;==>OnAutoItExit

Скриншот:

logo.jpg


Источник: FreeImage UDF (оффициальный форум)

Авторы:
Adam Gates
Alex Kwak
Alexander Dymerets
Detlev Vendt
Jan L. Nauta
Jani Kajala
Juergen Riecker
Karl-Heinz Bussian
Laurent Rocher
Luca Piergentili
Machiel ten Brinke
Markus Loibl
Martin Weber
Matthias Wandel
Michal Novotny
Petr Pytelka
Riley McNiff
Ryan Rubley
Volker G?rtner

Дизайн и реализация:
Floris van den Berg
Herv? Drolon

AutoIt: Prog@ndy
 

timsky

Осваивающий
Сообщения
93
Репутация
28
OffTopic:
Что-то не очень вдохновил FreeImage. ImageMagick рулит ИМХО :smile: правда, я с ним через ком. строку общаюсь.
 

Luke

Знающий
Сообщения
64
Репутация
14
FreeImage.au3 конфликтует с WinAPIEx UDF (повторно декларируется Global Const $tagBITMAPINFOHEADER), можно это исправить ?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В файле FreeImage.au3 замени везде $tagBITMAPINFOHEADER на $__tagBITMAPINFOHEADER.
 

syavak

Новичок
Сообщения
12
Репутация
1
Здраствуйте может ктото подскажет где копать
мне нужно из верхней картинки сделать нижнюю

первый пример конвертирует в оттенки серого
а как можна в чернобелое ?
и как можна сделать инверсию ?
спасиб за помощь

пока ток такого смог добится

с помощью GDIPlus.au3 ито сам непонял как )

итак такогоже результата добился и с помощью FreeImage
Код:
#Include <FreeImage.au3>

$sFile = 'Test.png'

_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_SaveU($FIF, $hGrey, @ScriptDir & '\Test_Grey.png')
_FreeImage_Invert($hGrey)
_FreeImage_SaveU($FIF, $hGrey, @ScriptDir & '\Test_Grey_Inverse.png')
_FreeImage_Unload($hImage)
_FreeImage_Unload($hGrey)

_FreeImage_DeInitialise()


получил картинку в оттенках серого
остается вопрос как получить в чернобелом виде
знающие помогите
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Подскажите как сделать
Код:
GUICtrlSetImage
предварительно не сохраняя изображение в файл на диске?
 
Верх