Что нового

Объединение фотофайлов - с помощью UDF GDIP

Visors

Новичок
Сообщения
58
Репутация
0
Здравствуйте.
Появился вопрос, касаемо UDF GDIP, которое описывают как - мощное дополнение к GDIPlus.au3
В общем это вещь, которая работает с графикой.

У меня имеется четыре рисунка jpg (1.jpg,2.jpg,3.jpg,4.jpg)- одинакового размера по ширине и высоте.

Как кодом autoit их надо соединить последовательно - в два ряда ?
Первый и второй рисунок - это верхний ряд.
Третий и четвертый рисунки - это нижний ряд.
rgho.st/7nXvy757R

Вот ссылка на саму UDF GDIP:
http://autoit-script.ru/index.php?topic=1384.0
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Visors [?]
GDIP, которое описывают как - мощное дополнение к GDIPlus.au3
В последней версии AutoIt практически вся GDIP находится в GDIPlus. Да и в ранних версиях GDIPlus достаточно функций для решения вашей проблемы.

Как кодом autoit их надо соединить последовательно - в два ряда ?
Загрузить изображения и узнать их размеры (если размеры одинаковые, то достаточно одного файла), рассчитать размер общего рисунка и создать его, скопировать рисунки из файлов на общий битмап в соответствующие координаты, сохранить полученное изображение. Вот список необходимых функций (для каждой есть пример в справке)
Код:
_GDIPlus_ImageLoadFromFile()
_GDIPlus_ImageGetWidth()
_GDIPlus_ImageGetHeight()
_GDIPlus_BitmapCreateFromScan0()
_GDIPlus_ImageGetGraphicsContext()
_GDIPlus_GraphicsDrawImage()
_GDIPlus_ImageSaveToFile()
 
Автор
V

Visors

Новичок
Сообщения
58
Репутация
0
InnI, а как использовать функцию BitmapCreateFromScan0 ?

Ссылка на _GDIPlus_BitmapCreateFromScan0() - пишет что страница отсутствует.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$hStream = _WinAPI_CreateStreamOnHGlobal($hData)
		$hImage = _GDIPlus_BitmapCreateFromStream($hStream)
		$NewImage = _GDIPlus_BitmapCreateFromScan0($iWidth / 3, $iHeight / 3, 0, _GDIPlus_ImageGetPixelFormatEx($hImage))
		$hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
		_GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
		_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hImage, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth / 3, $iHeight / 3)
		$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($NewImage)
		_GDIPlus_GraphicsDispose($hGraphics)
		_GDIPlus_ImageDispose($NewImage)
		_GDIPlus_ImageDispose($hImage)
Func _GDIPlus_ImageGetPixelFormatEx($hImage)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipGetImagePixelFormat", "ptr", $hImage, "int*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[2]
EndFunc   ;==>_GDIPlus_ImageGetPixelFormatEx
Func _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", $iStride, "int", $iPixelFormat, "ptr", $pScan0, "ptr*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[6]
EndFunc   ;==>_GDIPlus_BitmapCreateFromScan0
 
Автор
V

Visors

Новичок
Сообщения
58
Репутация
0
sngr что-то не работает.
Выдает ошибку:

$hStream = _WinAPI_CreateStreamOnHGlobal($hData)
$hStream = ^ ERROR
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Это пример _GDIPlus_BitmapCreateFromScan0, тебе $hImage нужно получать из _GDIPlus_ImageLoadFromFile()
 
Автор
V

Visors

Новичок
Сообщения
58
Репутация
0
sngr
Теперь выдает ошибку:
$hStream = _GDIPlus_ImageLoadFromFile("C:\1.jpg")
$hStream = ^ ERROR

Код:
$hStream = _GDIPlus_ImageLoadFromFile("C:\1.jpg")
        $hImage = _GDIPlus_BitmapCreateFromStream($hStream)
        $NewImage = _GDIPlus_BitmapCreateFromScan0($iWidth / 3, $iHeight / 3, 0, _GDIPlus_ImageGetPixelFormatEx($hImage))
        $hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
        _GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
        _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hImage, 0, 0, $iWidth, $iHeight, 0, 0, $iWidth / 3, $iHeight / 3)
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($NewImage)
        _GDIPlus_GraphicsDispose($hGraphics)
        _GDIPlus_ImageDispose($NewImage)
        _GDIPlus_ImageDispose($hImage)
Func _GDIPlus_ImageGetPixelFormatEx($hImage)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipGetImagePixelFormat", "ptr", $hImage, "int*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[2]
EndFunc   ;==>_GDIPlus_ImageGetPixelFormatEx
Func _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", $iStride, "int", $iPixelFormat, "ptr", $pScan0, "ptr*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[6]
EndFunc   ;==>_GDIPlus_BitmapCreateFromScan0
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
#include <GDIPlus.au3>
_GDIPlus_Startup()
$hImage1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\1.jpg")
$hImage2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\2.jpg")
$hImage3 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\3.jpg")
$hImage4 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\4.jpg")
$sCLSID = _GDIPlus_EncodersGetCLSID("JPG")
$iX = _GDIPlus_ImageGetWidth($hImage1)
$iY = _GDIPlus_ImageGetHeight($hImage1)
$GC = _GDIPlus_ImageGetGraphicsContext($hImage1)
$newBmp = _GDIPlus_BitmapCreateFromGraphics($iX*2, $iY*2, $GC)
$newGC = _GDIPlus_ImageGetGraphicsContext($newBmp)
_GDIPlus_GraphicsDrawImageRect($newGC, $hImage1, 0, 0, $iX, $iY)
_GDIPlus_GraphicsDrawImageRect($newGC, $hImage2, $iX, 0, $iX, $iY)
_GDIPlus_GraphicsDrawImageRect($newGC, $hImage3, 0, $iY, $iX, $iY)
_GDIPlus_GraphicsDrawImageRect($newGC, $hImage4,$iX, $iY, $iX, $iY)
_GDIPlus_ImageSaveToFileEx($newBmp, @ScriptDir & "\1234.jpg", $sCLSID)
_GDIPlus_GraphicsDispose($newBmp)
_GDIPlus_GraphicsDispose($GC)
_GDIPlus_ImageDispose($hImage1)
_GDIPlus_ImageDispose($hImage2)
_GDIPlus_ImageDispose($hImage3)
_GDIPlus_ImageDispose($hImage4)
_GDIPlus_Shutdown()
 
Автор
V

Visors

Новичок
Сообщения
58
Репутация
0
sngr огромное спасибо вам.
Теперь все объединяет.
 
Верх