Что нового

Получение количества каждого цвета в изображении

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
На написание этой функции вдохновили примеры от madmasles, Yashied, C2H5OH :whistle:

Функция позволяет достаточно быстро получить массив с отсортированным списком цветов, встречающихся в изображении, с указанием количества каждого цвета. Например, это может пригодиться при решении задач вроде описанной здесь:
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
 
Верх