На написание этой функции вдохновили примеры от madmasles, Yashied, C2H5OH :whistle:
Функция позволяет достаточно быстро получить массив с отсортированным списком цветов, встречающихся в изображении, с указанием количества каждого цвета. Например, это может пригодиться при решении задач вроде описанной здесь:
http://autoit-script.ru/index.php/topic,11556.0.html
Результат там сильно зависел от цвета фона, который во всех примерах брался произвольно, просто с края картинки, что могло привести к ошибкам.
Функция позволяет достаточно быстро получить массив с отсортированным списком цветов, встречающихся в изображении, с указанием количества каждого цвета. Например, это может пригодиться при решении задач вроде описанной здесь:
http://autoit-script.ru/index.php/topic,11556.0.html
Результат там сильно зависел от цвета фона, который во всех примерах брался произвольно, просто с края картинки, что могло привести к ошибкам.
Код:
#include <GDIPlus.au3>
#include <Array.au3>
#include <Color.au3>
$step = 1
$Array = _fon('Изображение.bmp', $step) ; возвращает массив пикселей, с указанием количества каждого пикселя
_ArrayDisplay($Array)
Func _fon($sPath, $count)
Local $hBitmap, $tMap, $Width, $Height, $bData, $i
_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromFile($sPath)
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)
If $Width * $Height < 16000000 Then
$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
$bData = StringTrimLeft($bData, 2)
$bData = '######FF' & $bData
$aTemp = StringRegExp($bData, '(\S{1,6})FF', 3)
$aTemp[0] = UBound($aTemp) - 1
For $i = 1 To $aTemp[0] Step $count
Assign($aTemp[$i], Eval($aTemp[$i]) + 1)
Next
Dim $uArray[$aTemp[0]][2] = [[0]]
For $i = 1 To $aTemp[0] Step $count
If Eval($aTemp[$i]) > 0 Then
$uArray[0][0] += 1
$uArray[$uArray[0][0]][0] = $aTemp[$i]
$uArray[$uArray[0][0]][1] = Eval($aTemp[$i])
Assign($aTemp[$i], -1)
EndIf
Next
ReDim $uArray[$uArray[0][0] + 1][2]
_ArraySort($uArray, 1, 1, 0, 1)
For $i = 1 To Ubound($uArray) - 1
$uArray[$i][0] = '0x' & Hex(_ColorGetBlue('0x' & $uArray[$i][0]), 2) & Hex(_ColorGetGreen('0x' & $uArray[$i][0]), 2) & Hex(_ColorGetRed('0x' & $uArray[$i][0]), 2)
Next
ConsoleWrite('Высота: ' & $Height & @CRLF)
ConsoleWrite('Ширина: ' & $Width & @CRLF)
ConsoleWrite('Всего цветов: ' & $aTemp[0] & @CRLF)
ConsoleWrite('Уникальных цветов: ' & $uArray[0][0] & @CRLF)
ConsoleWrite('Фон: ' & $uArray[1][0] & @CRLF)
Return $uArray
Else
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
EndIf
EndFunc ;==>_fon