#CS UDF: ImgMatrix.inc Версия: 1.1.0.0 Дата: 2:44 20.10.2017 Описание: ImgMatrix - Обнаружение изменений (движения) на BMP снимке Автор: Astel064 Источник: http://autoit-script.ru/index.php?topic=24669 Функции: _ImgMatrix_Check _ImgMatrix_ConvertImage _ImgMatrix_ConvertImageEx_OpenImg _ImgMatrix_ConvertImageEx_AddLabel _ImgMatrix_ConvertImageEx_CloseImg _ImgMatrix_ConvertImageEx_GetARgbColor ;================================================================================================================================ ;================================================================================================================================ ;================================================================================================================================ Функция: _ImgMatrix_Check($sBmpFile, $iIntervalPersent, ByRef $aMatrixArray, $sOutTechInfoImgFile="", $iRudeLevel=1, $iCheckType=1) Описание: Функция для проверки указанного изображения на наличие изменений Синтаксис: _ImgMatrix_Check($sBmpFile, $iIntervalPersent, $aMatrixArray, $sOutTechInfoImgFile, $iRudeLevel, $iCheckType) Параметры: $sBmpFile = Путь к контролируемому BMP файлу. Содержимое файла будет загружено в память для последующей обработки. $iIntervalPersent = Процент деления изображения на части для расстановки контрольных точек. Если указано значение "10", то изображение будет разделено на 10 равных частей. На каждой части будет установлена контрольная точка. $aMatrixArray = Массив Matrix. При первом вызове можно передать пустую строку. С помощью этого параметра выполняется обратное (ByRef) обновление массива Matrix. В дальнейшем, функция будет хранить (и изменять) массив Matrix в этой переменной. $sOutTechInfoImgFile = Если указан путь к конечному BMP (или JPG) файлу, то программа укажет на загруженном ранее изображении контрольные точки: неизмененные - красным цветом; измененные (значение которых изменилось) - желтым. Также на изображении будет указано кол-во и процент измененных контр. точек. После, функция сохранит измененное изображение по указанному пути. $iRudeLevel = Уровень грубости поиска. Служит для исключения ложных срабатываний. Чем больше значение, тем грубее идет проверка. При слишком большом значении сканирование может не заметить изменения на изображении. Если изображение имеет хорошее качество, то этот параметр может и не понадобится (значение "0"). $iCheckType = Тип сканируемого значения: 0 = Сканировать по цвету областей контрольных точек. 1 = (по умолчанию) сканировать по яркости обл. контр. точек. 2 = Сканировать по контрасности обл. к.т. Возврат: 2D массив измененных контрольных точек, где: $aRet[0][0] = Общее количество элементов массива и контр. точек $aRet[0][1] = Процент измененных контр. точек на изображении $aRet[1][0] = Значение 1 измененной контрольной точки $aRet[1][1] = Положение 1 изм. к.т. по ширине $aRet[1][2] = Положение 1 изм. к.т. по высоте и т.д... @Error: 0=Успех; иначе=Ошибка @Extended: Кол=во измененных контрольных точек Описание алгоритма работы: Функция делит изображение на равные части. Каждая часть сжимается, после чего функция получает параметры контрольной точки (цвет, яркость или контрастность) и заносит параметры точки в новый массив. Старый массив сверяется с новым, измененные контрольные точки заносятся в другой массив, который будет возвращен пользователю после завершения работы функции. В случае, если функция запускается первый раз, то в качестве $aMatrixArray может быть передано любое значение (но не массив!). В этом случае, функция вернет список всех контр. точек (100% измененных точек). Также функция перезапишет $aMatrixArray для следующего использования. При втором запуске функции старый $aMatrixArray уже будет существовать, функция приступит к поиску измененных контрольных точек. До первого запуска функции Вам потребуется создать с любым названием - в нее будет автоматически сохранен массив Matrix. В дальнейшем, массив Matrix будет обновляться после каждого запуска функции. ВНИМАНИЕ! • Не изменяйте переменную с массивом Matrix. • Не изменяйте параметры $iIntervalPersent, $iRudeLevel, $iCheckType при повторном использовании функции со старым массивом Matrix. Еслы Вам требуется изменить какой-либо из вышеперечисленных параметров после первого запуска функции, то создайте новую (или обнулите старую) переменную с массивом Matrix. Теперь можно выполнить первый запуск функции с новыми параметрами. Массив Matrix будет перестроен. ;================================================================================================================================ ;================================================================================================================================ ;================================================================================================================================ Функция: _ImgMatrix_ConvertImage($sSrc, $sDest, $sAddLabel="") Описание: Конвертирует .BMP файл в формат .JPG и добавляет надпись Синтаксис: _ImgMatrix_ConvertImage($sSrc, $sDest, $sAddLabel) Параметры: $sSrc = Путь к входному BMP файлу $sDest = Путь к выходному JPG файлу $sAddLabel = Текст добавляемой надписи. Если не указан (по умолчанию), то надпись не будет добавлена Возврат: 1=Успех; 0=Ошибка @Error: 0=Успех; иначе=Ошибка @Extended: Всегда 0 ;================================================================================================================================ ;================================================================================================================================ ;================================================================================================================================ Функция: _ImgMatrix_ConvertImageEx_OpenImg($sSrc) Описание: Открывает указанный BMP файл для дальнейшей расширенной конвертации Синтаксис: _ImgMatrix_ConvertImageEx_OpenImg($sSrc) Параметры: $sSrc = Путь к входному BMP файлу Возврат: Дескриптор изображения @Error: 0=Успех; иначе=Ошибка @Extended: Всегда 0 ;================================================================================================================================ Функция: _ImgMatrix_ConvertImageEx_AddLabel($aImage, $sLabelText, $iPosW=10, $iPosH=-35, $iWidth=-20, $iHeight=25, $iFontArgbColor=0xFFFFFFFF, $sFontFamily="Arial", $iFontSize=12, $iFontStyle=1) Описание: Добавляет надпись в изображение Синтаксис: _ImgMatrix_ConvertImageEx_AddLabel($aImage, $sLabelText, $iPosW, $iPosH, $iWidth, $iHeight, $iFontArgbColor, $sFontFamily, $iFontSize, $iFontStyle) Параметры: $aImage = Дескриптор изображения (возвращаемое значение функции _ImgMatrix_ConvertImageEx_OpenImg) $sLabelText = Текст добавляемой надписи $iPosW = Позиция надписи по горизонтали. Может иметь как положительное значение, так и отрицательное. См. Примечания. $iPosH = Позиция надписи по вертикали. Может иметь как положительное значение, так и отрицательное. См. Примечания. $iWidth = Ширина надписи. Может иметь как положительное значение, так и отрицательное. См. Примечания. $iHeight = Высота надписи. Может иметь как положительное значение, так и отрицательное. См. Примечания. $iFontArgbColor = ARGB цвет изображения (прозрачность и RGB цвет). См. Примецания. $sFontFamily = Имя используемого шрифта. $iFontSize = Размер шрифта. $iFontStyle = Стиль шрифта: 0 - Нормальный 1 - Жирный 2 - Курсив 4 - Подчёркнутый 8 - Зачёркнутый Возврат: 1=Успех; 0=Ошибка @Error: 0=Успех; иначе=Ошибка @Extended: Всегда 0 Примечания: • Параметры $iPosW, $iPosH, $iWidth, $iHeight могут иметь следующие значения: Положительное - Значение является координатой. Допустим, указано $iPosW=10 - левый край надписи будет на 10 пикселе изображения. Отрицательное - Значение будет суммировано с шириной (или высотой) изображения. Допустим, ширина изображения равна 800 пикселям, указано $iPosW=-700 - левый край надписи будет на 100 пикселе изображения, т.к. 800+(-700)=800-700=100 • В качестве параметра $iFontArgbColor можно передать возвращаемое значение функции _ImgMatrix_ConvertImageEx_GetARgbColor. ;================================================================================================================================ Функция: _ImgMatrix_ConvertImageEx_CloseImg(ByRef $aImage, $sDest) Описание: Сохраняет ранее открытое функцией _ImgMatrix_ConvertImageEx_OpenImg изображение в указанный JPG файл и закрывает его (изображение) Синтаксис: _ImgMatrix_ConvertImageEx_CloseImg($aImage, $sDest) Параметры: $aImage = Дескриптор изображения (возвращаемое значение функции _ImgMatrix_ConvertImageEx_OpenImg) $sDest = Путь к выходному JPG файлу Возврат: 1=Успех; 0=Ошибка @Error: 0=Успех; иначе=Ошибка @Extended: Всегда 0 ;================================================================================================================================ Функция: _ImgMatrix_ConvertImageEx_GetARgbColor($iTransparent, $sRgbColor) Описание: Создает ARGB цвет (для функции _ImgMatrix_ConvertImageEx_AddLabel) Синтаксис: _ImgMatrix_ConvertImageEx_GetARgbColor($iTransparent, $sRgbColor) Параметры: $iTransparent = Прозрачность от 0 (невидимо, полностью прозрачно) до 255 (непрозрачно) $sRgbColor = RGB цвет Возврат: ARGB Цвет @Error: Всегда 0 @Extended: Всегда 0 ;================================================================================================================================ Пример: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; Подключаем UDF в скрипт #include "ImgMatrix.inc" ; Подключаем Array.au3 (для просмотра результата с помощью _ArrayDisplay) #include ; Создаем переменную для хранения массива Matrix и переменную для возращаемого массива. Local $aMatrix = "" Local $aReturn ; Предполагается, что @ScriptDir&"\Image.bmp" сохраняется другой программой. Это может быть как скриншет раб. стола, так и снимок с веб-камеры. ; Выполняем первый запуск функции. В переменную $aMatrix будет автоматически сохранен массив Matrix. $aReturn = _ImgMatrix_Check(@ScriptDir&"\Image.bmp", 10, $aMatrix, @ScriptDir&"\Test.bmp", 2, 1) ; В файл @ScriptDir&"\Test.bmp" будет сохранена копия @ScriptDir&"\Image.bmp" с отметками контрольных точек и технической информацией. ; Проверяем результат на предмет ошибок. Если ошибки имеются, то выводим сообщение и завершаем скрипт. If @Error Then Exit MsgBox(0,"Ошибка первого запуска", "Код: "&@Error) ; Выводим результат (массив будет со значениями 0, 0 в 0 строке) _ArrayDisplay($aReturn) ; Начинаем бесконечный цикл проверки изображения с интервалом в 1 сек (1000 мсек.) While 1 Sleep(1000) ; Выполняем повторный запуск функции. Параметры $iIntervalPersent, $iRudeLevel, $iCheckType изменять нельзя. $aReturn = _ImgMatrix_Check(@ScriptDir&"\Image.bmp", 10, $aMatrix, @ScriptDir&"\Test.bmp", 2, 1) ; Проверяем результат на предмет ошибок. Если ошибки имеются, то выводим сообщение. If @Error Then MsgBox(0,"Ошибка повторного запуска", "Код: "&@Error) ; Выводим результат (список измененных контр. точек. Изменений нет, то врернется массив со значениями 0, 0 в 0 строке) _ArrayDisplay($aReturn) ; Выводим сообщение с количеством изм. контр. точек MsgBox(0,"Кол-во", "Изменено контрольных точек: "&$aReturn[0][0] & "(" &$aReturn[0][1]& "%)") Wend //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Конец примера. #CE #include-once #include #include #include Func _ImgMatrix_Check($sBmpFile, $iIntervalPersent, ByRef $aMatrixArray, $sOutTechInfoImgFile="", $iRudeLevel=1, $iCheckType=1) Local $aNewMatrix, $iErrKey, $aRetArray[1][3]=[[0,0]] $aNewMatrix = __ImgMatrix__Ext($sBmpFile, $iIntervalPersent, $iCheckType) $iErrKey = @Error If $iErrKey Then $aRetArray[0][0] = 0 $aRetArray[0][1] = 0 $aRetArray[0][2] = "Ext:E"&$iErrKey Return SetError(100+$iErrKey, 0, $aRetArray) EndIF If NOT IsArray($aMatrixArray) Then $aMatrixArray = $aNewMatrix $aRetArray = $aNewMatrix $aRetArray[0][1] = 100 $aRetArray[0][2] = "C" If $sOutTechInfoImgFile <> "" Then __ImgMatrix__CreateTechnicalInfoImageFile($sBmpFile, $sOutTechInfoImgFile, $iIntervalPersent, $aMatrixArray, $aRetArray) Return SetError(0, 0, $aRetArray) EndIF $aRetArray = __ImgMatrix__Check($aMatrixArray, $aNewMatrix, $iRudeLevel) $iErrKey = @Error $aMatrixArray = $aNewMatrix $aNewMatrix = 0 If $sOutTechInfoImgFile <> "" Then __ImgMatrix__CreateTechnicalInfoImageFile($sBmpFile, $sOutTechInfoImgFile, $iIntervalPersent, $aMatrixArray, $aRetArray) If $iErrKey Then $aRetArray[0][0] = 0 $aRetArray[0][1] = 0 $aRetArray[0][2] = "Chk:E"&$iErrKey Return SetError(200+$iErrKey, 0, $aRetArray) EndIF $aRetArray[0][1] = Round(100*$aRetArray[0][0]/$aMatrixArray[0][0]) Return SetError(0, $aRetArray[0][0], $aRetArray) EndFunc ; ========================================================================================================= #CS __ImgMatrix__CreateTechnicalInfoImageFile Функция сохраняет отметки контрольных точек на указанном изображении и сохраняет результат в конечный файл Параметры: $sBmpFile = Указанный BMP файл изображения. Из него будет выполнена загрузка изображения в память $sOutImgFile = Конечный файл изображения. В него удет сохранен результат работы. $iIntervalPersent = Процент расстановки контрольных точек по изображению. Например, указано значение "10": это значит, что изображение будет поделено на 10 равных частей как по ширине, так и по высоте. На каждой части будет установлена контрольная точка, изменения которой будут фиксироваться. $aMatrixArray = Массив, используемый в функции __ImgMatrix__Ext и _ImgMatrix_Check $aReturnArray = Возвращаемое значение функции _ImgMatrix_Check Возврат: 0=Ошибка, иначе = успех @Error: 0=Успех, иначе = ошибка #CE ; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Func __ImgMatrix__CreateTechnicalInfoImageFile($sBmpFile, $sOutImgFile, $iIntervalPersent, ByRef $aMatrixArray, ByRef $aReturnArray) Local $hBitmap, $hGraphic, $hRedBrush, $hYelloyBrush, $i, $hBrush, $hFormat, $hFamily, $hFont, $tLayout If UBound($aMatrixArray, 2) <> 3 Then Return SetError(1,0,0) If NOT IsArray($aReturnArray) Then Return SetError(2,0,0) _GDIPlus_Startup() $hBitmap = _GDIPlus_ImageLoadFromFile($sBmpFile) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap) $hRedBrush = _GDIPlus_BrushCreateSolid(0x2AFF0000) $hYelloyBrush = _GDIPlus_BrushCreateSolid(0xFFFFFF00) If $aMatrixArray[0][0] > 0 Then For $i = 1 To $aMatrixArray[0][0] _GDIPlus_GraphicsFillEllipse($hGraphic, $aMatrixArray[$i][1]-5, $aMatrixArray[$i][2]-5, 10, 10, $hRedBrush) Next EndIF If $aReturnArray[0][0] > 0 Then For $i = 1 To $aReturnArray[0][0] _GDIPlus_GraphicsFillEllipse($hGraphic, $aReturnArray[$i][1]-3, $aReturnArray[$i][2]-3, 6, 6, $hYelloyBrush) Next EndIF $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF) $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate("Arial") $hFont = _GDIPlus_FontCreate($hFamily, 12, 1) $tLayout = _GDIPlus_RectFCreate(10, 450, 400, 100) _GDIPlus_GraphicsDrawStringEx($hGraphic, @MDAY&"/"&@MON&"/"&@YEAR&" ["&@HOUR&":"&@MIN&":"&@SEC&"] >> Detect points: "&$aReturnArray[0][0]&" ("&Round(100*$aReturnArray[0][0]/$aMatrixArray[0][0])&"%)", $hFont, $tLayout, $hFormat, $hBrush) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) _GDIPlus_ImageSaveToFile($hBitmap, $sOutImgFile) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_BrushDispose($hRedBrush) _GDIPlus_BrushDispose($hYelloyBrush) _GDIPlus_ImageDispose($hBitmap) _GDIPlus_Shutdown() Return SetError(0,0,1) EndFunc ; ========================================================================================================= #CS __ImgMatrix__Ext Функция сканирует указанное изображение по контрольным точкам и возвращает их значение в 2D массиве Параметры: $sBmpFile = Указанный BMP файл изображения. Из него будет выполнена загрузка изображения в память $iIntervalPersent = Процент расстановки контрольных точек по изображению. Например, указано значение "10": это значит, что изображение будет поделено на 10 равных частей как по ширине, так и по высоте. На каждой части будет установлена контрольная точка, изменения которой будут фиксироваться. $iCheckType = Тип проверки (см. параметр $iCheckType в функции _ImgMatrix_Check) Возврат: 0=Ошибка, иначе = успех: двухмерный массив со всеми контрольными точками, где: $aReturn[0][0] = Общее кол-во элементов массива (а также, и контрольных точек) $aReturn[1][0] = 1 контрольная точка: значение $aReturn[1][1] = 1 контрольная точка: положение по ширине $aReturn[1][2] = 1 контрольная точка: положение по высоте @Error: 0=Успех, иначе = ошибка #CE ; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Func __ImgMatrix__Ext($sBmpFile, $iIntervalPersent=10, $iCheckType=1) Local $hImage, $hBitmap, $iW, $iH, $iWStep, $iHStep, $aMatrix[1][3]=[[0]], $HLS[3], $hSrcDC, $hSrcSv, $hDstDC, $hDib, $hDstSv, $iWPos, $iHPos, $iRGB, $i _GDIPlus_Startup() $hImage = _GDIPlus_ImageLoadFromFile($sBmpFile) If $hImage = 0x00000000 Then Return SetError(1,0,0) If $iCheckType < 0 OR $iCheckType > 2 Then $iCheckType = 1 $iCheckType = $iCheckType*1 $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $iW = _GDIPlus_ImageGetWidth($hImage) $iH = _GDIPlus_ImageGetHeight($hImage) _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() If $iH < 1 AND $iW < 1 Then Return SetError(1,0,0) $iWStep = Round($iW/$iIntervalPersent) $iHStep = Round($iH/$iIntervalPersent) _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() $hSrcDC = _WinAPI_CreateCompatibleDC(0) $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBitmap) $hDstDC = _WinAPI_CreateCompatibleDC(0) $hDib = _WinAPI_CreateDIB(1, 1) $hDstSv = _WinAPI_SelectObject($hDstDC, $hDib) _WinAPI_SetStretchBltMode($hDstDC, 4); $HALFTONE=4 $iWPos = Round($iWStep/2) $iHPos = Round($iHStep/2) While 1 _WinAPI_StretchBlt($hDstDC, 0, 0, 1, 1, $hSrcDC, $iWPos-Round($iWStep/2), $iWPos-Round($iHStep/2), $iWStep, $iHStep, 13369376); $SRCCOPY=13369376 $iRGB = _WinAPI_GetPixel($hDstDC, 0, 0) _WinAPI_ColorRGBToHLS($iRGB, $HLS[0], $HLS[1], $HLS[2]) $aMatrix[0][0] += 1 ReDim $aMatrix[$aMatrix[0][0]+1][3] $aMatrix[$aMatrix[0][0]][0] = $HLS[$iCheckType] $aMatrix[$aMatrix[0][0]][1] = $iWPos $aMatrix[$aMatrix[0][0]][2] = $iHPos $iWPos += $iWStep If $iWPos >= $iW Then $iWPos = Round($iWStep/2) $iHPos += Round($iHStep/2) EndIF If $iHPos >= $iH Then ExitLoop Wend _WinAPI_SelectObject($hSrcDC, $hSrcSv) _WinAPI_DeleteObject($hBitmap) _WinAPI_DeleteDC($hSrcDC) _WinAPI_SelectObject($hDstDC, $hDstSv) _WinAPI_DeleteObject($hDib) _WinAPI_DeleteDC($hDstDC) ; _ArrayDisplay($aMatrix, 'Return') Return $aMatrix EndFunc ; ========================================================================================================= #CS __ImgMatrix__Check Функция выполняет проверку двух массивов и возвращает список измененных точек Параметры: $aExtOld = Старый массив Matrix (возвращаемое значение __ImgMatrix__Ext) $aExtNew = Новый массив Matrix (возвращаемое значение __ImgMatrix__Ext) $iRudeLevel = Грубость проверки (см. параметр $iRudeLevel в функции _ImgMatrix_Check) Возврат: 0=Ошибка, иначе = успех: двухмерный массив с измененными контрольными точками, где: $aReturn[0][0] = Общее кол-во элементов массива (а также, и измененных контрольных точек) $aReturn[1][0] = 1 контрольная точка: значение $aReturn[1][1] = 1 контрольная точка: положение по ширине $aReturn[1][2] = 1 контрольная точка: положение по высоте @Error: 0=Успех, иначе = ошибка #CE ; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Func __ImgMatrix__Check(ByRef $aExtOld, ByRef $aExtNew, $iRudeLevel=1) Local $aReturn[1][3]=[[0]], $i, $n If UBound($aExtOld, 2) <> 3 Then Return SetError(1,0,$aReturn) If UBound($aExtNew, 2) <> 3 Then Return SetError(2,0,$aReturn) If $aExtOld[0][0] <> $aExtNew[0][0] Then Return SetError(3,0,$aReturn) $iRudeLevel = Round($iRudeLevel) For $i = 1 To $aExtOld[0][0] If $aExtOld[$i][0] = $aExtNew[$i][0] Then ContinueLoop If $iRudeLevel > 0 Then For $n = 1 To $iRudeLevel If $aExtOld[$i][0] = Round($aExtNew[$i][0]+$n) Then ContinueLoop 2 If $aExtOld[$i][0] = Round($aExtNew[$i][0]-$n) Then ContinueLoop 2 Next EndIF $aReturn[0][0] += 1 ReDim $aReturn[$aReturn[0][0]+1][4] $aReturn[$aReturn[0][0]][0] = $aExtOld[$i][0] $aReturn[$aReturn[0][0]][1] = $aExtOld[$i][1] $aReturn[$aReturn[0][0]][2] = $aExtOld[$i][2] Next Return SetError(0,$aReturn[0][0],$aReturn) EndFunc ; ========================================================================================================= ;~ ########################################################## Func _ImgMatrix_ConvertImage($sSrc, $sDest, $sAddLabel="") Local $hImage, $iWidth, $iHeight, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $iError _GDIPlus_Startup() $hImage = _GDIPlus_ImageLoadFromFile($sSrc) If @Error Then $iError = @Error _GDIPlus_Shutdown() Return SetError(1,$iError,0) EndIF If $sAddLabel <> "" Then $iWidth = _GDIPlus_ImageGetWidth($hImage) $iHeight = _GDIPlus_ImageGetHeight($hImage) $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF) $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate("Arial") $hFont = _GDIPlus_FontCreate($hFamily, 12, 1) $tLayout = _GDIPlus_RectFCreate(10, $iHeight-30, $iWidth-20, 25) ;_GDIPlus_GraphicsDrawStringEx($hGraphic, @MDAY&"/"&@MON&"/"&@YEAR&" ["&@HOUR&":"&@MIN&":"&@SEC&"]", $hFont, $tLayout, $hFormat, $hBrush) _GDIPlus_GraphicsDrawStringEx($hGraphic, $sAddLabel, $hFont, $tLayout, $hFormat, $hBrush) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGraphic) EndIf _GDIPlus_ImageSaveToFile($hImage, $sDest) $iError = @Error _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() If $iError Then Return SetError(2,$iError,0) Return SetError(0,0,1) EndFunc ;~ ########################################################## Func _ImgMatrix_ConvertImageEx_OpenImg($sSrc) Local $hImage, $iError, $aImage[4]=[-1, 0, 0,-1] _GDIPlus_Startup() $hImage = _GDIPlus_ImageLoadFromFile($sSrc) If @Error Then $iError = @Error _GDIPlus_Shutdown() Return SetError($iError,0,$aImage) EndIF $aImage[0] = $hImage $aImage[1] = _GDIPlus_ImageGetWidth($hImage) $aImage[2] = _GDIPlus_ImageGetHeight($hImage) $aImage[3] = _GDIPlus_ImageGetGraphicsContext($hImage) Return SetError(0,1,$aImage) EndFunc Func _ImgMatrix_ConvertImageEx_AddLabel($aImage, $sLabelText, $iPosW=10, $iPosH=-35, $iWidth=-20, $iHeight=25, $iFontArgbColor=0xFFFFFFFF, $sFontFamily="Arial", $iFontSize=12, $iFontStyle=1) Local $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $iError, $i If NOT IsArray($aImage) OR UBound($aImage) <> 4 Then Return SetError(1,0,0) If $aImage[0] = -1 OR $aImage[3] = -1 OR $aImage[1] < 1 OR $aImage[2] < 1 Then Return SetError(2,0,0) If $iPosW < 1 Then $iPosW = $aImage[1]+$iPosW If $iPosH < 1 Then $iPosH = $aImage[2]+$iPosH If $iWidth < 1 Then $iWidth = $aImage[1]+$iWidth If $iHeight < 1 Then $iHeight = $aImage[2]+$iHeight $hBrush = _GDIPlus_BrushCreateSolid($iFontArgbColor) $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate($sFontFamily) $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontStyle) $tLayout = _GDIPlus_RectFCreate($iPosW, $iPosH, $iWidth, $iHeight) _GDIPlus_GraphicsDrawStringEx($aImage[3], $sLabelText, $hFont, $tLayout, $hFormat, $hBrush) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) Return SetError(0,0,1) EndFunc Func _ImgMatrix_ConvertImageEx_CloseImg(ByRef $aImage, $sDest) Local $iError=0, $fOk If NOT IsArray($aImage) OR UBound($aImage) <> 4 Then Return SetError(1,0,0) If $aImage[0] = -1 OR $aImage[3] = -1 OR $aImage[1] < 1 OR $aImage[2] < 1 Then Return SetError(2,0,0) _GDIPlus_GraphicsDispose($aImage[3]) $fOk = _GDIPlus_ImageSaveToFile($aImage[0], $sDest) $iError = @Error _GDIPlus_ImageDispose($aImage[0]) _GDIPlus_Shutdown() $aImage[0] = -1 $aImage[1] = 0 $aImage[2] = 0 $aImage[3] = -1 If $iError OR NOT $fOk Then Return SetError(100+$iError,0,0) Return SetError(0,0,1) EndFunc Func _ImgMatrix_ConvertImageEx_GetARgbColor($iTransparent, $sRgbColor) Local $RGB $iTransparent = Hex($iTransparent*1) $iTransparent = StringRight($iTransparent, 2) $RGB = $sRgbColor If StringLeft($RGB, 2) <> "0x" Then $RGB = Hex($RGB) If StringLeft($RGB, 2) = "0x" Then $RGB = StringTrimLeft($RGB, 2) Return "0x"&$iTransparent&$RGB EndFunc