Автор Тема: Получение количества каждого цвета в изображении  (Прочитано 2193 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн WSWR [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 935
  • Репутация: 352
    • Награды
  • Версия AutoIt: 3.3.14.0
На написание этой функции вдохновили примеры от madmasles, Yashied, C2H5OH  :whistle:

Функция позволяет достаточно быстро получить массив с отсортированным списком цветов, встречающихся в изображении, с указанием количества каждого цвета. Например, это может пригодиться при решении задач вроде описанной здесь:
http://autoit-script.ru/index.php/topic,11556.0.html
Результат там сильно зависел от цвета фона, который во всех примерах брался произвольно, просто с края картинки, что могло привести к ошибкам.

Код: AutoIt [Выделить]
#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
 

« Последнее редактирование: Ноябрь 22, 2012, 15:18:39 от WSWR »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
12 Ответов
7590 Просмотров
Последний ответ Январь 04, 2012, 13:40:17
от Guezt Gutsy
5 Ответов
3162 Просмотров
Последний ответ Октябрь 29, 2010, 11:57:12
от asdf8
7 Ответов
3829 Просмотров
Последний ответ Март 08, 2011, 14:28:34
от Belfigor
5 Ответов
3442 Просмотров
Последний ответ Май 20, 2011, 02:50:52
от Yashied
2 Ответов
2709 Просмотров
Последний ответ Март 15, 2012, 17:44:01
от ---Zak---
1 Ответов
1565 Просмотров
Последний ответ Август 08, 2012, 10:25:42
от rusreg79
7 Ответов
4765 Просмотров
Последний ответ Март 20, 2013, 23:05:34
от Kaster
12 Ответов
2805 Просмотров
Последний ответ Март 17, 2016, 12:10:58
от Vovsla
2 Ответов
1622 Просмотров
Последний ответ Февраль 01, 2017, 20:47:20
от Qweezy
3 Ответов
528 Просмотров
Последний ответ Июль 12, 2018, 09:23:54
от alex33