#CS
=======================================================================================
Функция: _BmpMatrix_Init($sBmpFile, $iCoefficient)
Описание: Выполнить инициализацию и преобразование файла изображения в массив, пригодный для дальнейшего работы с ним
Синтаксис: _BmpMatrix_Init($sBmpFile, $iCoefficient=100)
Параметры:
$sBmpFile = Файл растрового изображения в формате .BMP
$iCoefficient = Коэффициент маштабирования. По умолчанию = 100
Return: При успешном выполнении возвращается массив
@Error: 0=Успех; 1=Ошибка файла изображения.
=======================================================================================
Функция: _BmpMatrix_Check($aChecksum, $sBmpFile, $iDetectLevel, $iCoefficient)
Описание: Выводит положительное число, если изображение изменилось с момента последнего вызова _BmpMatrix_Init или _BmpMatrix_Check
Синтаксис: _BmpMatrix_Check(ByRef $aChecksum, $sBmpFile, $iDetectLevel=6, $iCoefficient=100)
Параметры:
$aChecksum = Массив, возращенный функцией _BmpMatrix_Init.
$sBmpFile = Файл растрового изображения в формате .BMP
$iDetectLevel = Уровень обнаружения (от 5 и выше). По умолчанию = 6
$iCoefficient = Коэффициент маштабирования. По умолчанию = 100
Return: Если файл не был изменен, то возвращается 0, иначе - положительное число выше $iDetectLevel.
@Error: 0=Успех; 1=Ошибка файла изображения; 2=Неверное значение $aChecksum.
Примечание: Функция _BmpMatrix_Check может быть вызвана только после вызова _BmpMatrix_Init.
=======================================================================================
#CE
#include-once
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Func _BmpMatrix_Init($sBmpFile, $iCoefficient=100)
Local $aMatrixArray
If NOT FileExists($sBmpFile) Then Return SetError(1,0,0)
$aMatrixArray = __BmpMatrix__Ext($sBmpFile, $iCoefficient)
If @Error Then Return SetError(1,0,0)
Return SetError(0,0,$aMatrixArray)
EndFunc
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Func _BmpMatrix_Check(ByRef $aChecksum, $sBmpFile, $iDetectLevel=6, $iCoefficient=100)
Local $i=0, $aMatrix
If NOT IsArray($aChecksum) Then Return SetError(2,0,0)
$aMatrix = __BmpMatrix__Ext($sBmpFile, $iCoefficient)
If @Error Then Return SetError(1,0,0)
For $i = 0 To UBound($aMatrix) - 1
If $aChecksum[$i] <> $aMatrix[$i] Then $i += $i
Next
If $i > $iDetectLevel Then
$aChecksum = $aMatrix
Return SetError(0,0,$i)
EndIf
Return SetError(0,-1,0)
EndFunc
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Func __BmpMatrix__Ext($sBmpFile, $iCoefficient)
Local $hImage, $hBitmap, $W, $H, $hSrcDC, $hSrcSv, $hDstDC, $hDib, $hDstSv, $RGB, $Min, $Max, $Q, $ggg
;_WebcamSnapShot($sTempFile)
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($sBmpFile)
If $hImage = 0x00000000 Then Return SetError(1,0,0)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$W = _GDIPlus_ImageGetWidth($hImage)
$H = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
If $H < 1 AND $W < 1 Then Return SetError(1,0,0)
Dim $Matrix[Round($H / $iCoefficient)][Round($W / $iCoefficient)]
Dim $HLS[3]
_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
For $y = 0 To $H / $iCoefficient - 1
For $x = 0 To $W / $iCoefficient - 1
_WinAPI_StretchBlt($hDstDC, 0, 0, 1, 1, $hSrcDC, $x * $iCoefficient, $y * $iCoefficient, $iCoefficient, $iCoefficient, 13369376); $SRCCOPY=13369376
$RGB = _WinAPI_GetPixel($hDstDC, 0, 0)
_WinAPI_ColorRGBToHLS($RGB, $HLS[0], $HLS[1], $HLS[2])
$Matrix[$y][$x] = $HLS[1]
Next
Next
_WinAPI_SelectObject($hSrcDC, $hSrcSv)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hSrcDC)
_WinAPI_SelectObject($hDstDC, $hDstSv)
_WinAPI_DeleteObject($hDib)
_WinAPI_DeleteDC($hDstDC)
;_ArrayDisplay($Matrix, 'Luminance')
$Min = 240
$Max = 0
For $y = 0 To $H / $iCoefficient - 1
For $x = 0 To $W / $iCoefficient - 1
If $Min > $Matrix[$y][$x] Then $Min = $Matrix[$y][$x]
If $Max < $Matrix[$y][$x] Then $Max = $Matrix[$y][$x]
Next
Next
$Q = Round(($Min + $Max) / 2)
$ggg = 0
Dim $fff[$W / $iCoefficient - 1]
For $y = 0 To $H / $iCoefficient - 1
For $x = 0 To $W / $iCoefficient - 1
;$Matrix[$y][$x] = $Matrix[$y][$x]
$ggg += Number($Matrix[$y][$x] < $Q)
Next
$fff[$y] = $ggg
$ggg = 0
Next
Return $fff
EndFunc ;==>__BmpMatrix__Ext
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------