Что нового

как получить цвета пикселей в двухмерный массив какие функции использовать ?

Статус
Закрыто для дальнейших ответов.
Сообщения
35
Репутация
-1
Добрый день я вернулся с отпуска (бана) :smile:

функций много , голова пухнет толку ноль
вопрос такой не знаю что использовать
есть изображение мне его надо вывести в 2D массив (матрицу) формат png в каждую ячейку получить цвет пикселя (кому интересно капча)
собственно достаточно в виде 1,0 если пиксель не указанный 0 другой цвет 1

не могу разобраться как это сделать чтоб не открывать окно и не вставлять в него картинку (если это не сложно и возможно)
файл получаю функцией _IEImageGetBinary

дальше наскок понимаю над использовать библиотеку <GDIPlus.au3>
и тут полный ступор :smile: Bitmap для меня слова из космоса просидел 2 дня пытаясь что то понять нифига :stars:

прошу указать какие функции мне нужны в каком порядке и если не сложно несколько пояснений

P:S модераторам если опять что то неправильно назвал (тему) написал (вопрос) извиняйте по другому не умею :smile:
 

qqww22

Новичок
Сообщения
115
Репутация
4
http://autoit-script.ru/index.php?topic=18630.msg112421#msg112421
 
Автор
G
Сообщения
35
Репутация
-1
qqww22 сказал(а):
http://autoit-script.ru/index.php?topic=18630.msg112421#msg112421

спасибо за ссылку но я новичок и не умею переделывать готовые коды так с функциями работу которых я не понимаю,
и это не ответ на мой вопрос в данном случае я просмотрел 2 пример который у меня сработал, а первый я незнаю как его задействовать по причине написанной выше

так вот в 2 вариант собственно посмотрел в консоли значения переменных увидел

Код:
@@ Debug(21) : $hData = 0x0000000003600018
>Error code: 0
@@ Debug(24) : $pData = 0x0000000000953A20
>Error code: 0
@@ Debug(27) : $tData  = 
>Error code: 0
@@ Debug(32) : $hStream = 0x0000000003925070
>Error code: 0
@@ Debug(36) : $hImage = 0x00000000054041A0
>Error code: 0
@@ Debug(41) : $iWidth = 110
>Error code: 0
@@ Debug(44) : $iHeight = 20
>Error code: 0
@@ Debug(52) : $hForm  = 0x000000000089110E
>Error code: 0
@@ Debug(55) : $nPic = 3
>Error code: 0
@@ Debug(58) : $hPic = 0x00000000005D0F0A
>Error code: 0
@@ Debug(61) : _SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap) = -754635884
>Error code: 0
@@ Debug(64) : $hObj = 17107390

вижу размер картинки дескрипторы а которая из них цвет пикселя выдает ( одного пикселя ) ? и куда мне туда массив прикручивать какую переменную в цикле прогонять ?

вопрос был такой как получить данные из файла не встраивая его в окно открыть файл (или загнать с интернета в память и считать цвет пикселя и его расположение в картинке и загнать эту информацию в массив в каком коде эта информация будет неважно десятичный или еще какой главное в числах

извиняюсь если слишком туп чтоб понять как так сделать но как сделать скрин изображения в открытом окне я не спрашивал
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Автор
G
Сообщения
35
Репутация
-1
madmasles сказал(а):
Gen345,
[info border=#0000ff float=left]С такой постановкой вопроса Вам надо в Стол заказов.
Переоформите тему в соответствии с Правилами обязательного оформления тем в разделе "Стол заказов" и я ее туда перенесу.[/info]



да блин одни отсылки я прошу подсказать функции я уверен из немного просто перебирать все функции библиотеки жесть

я не прошу готовый код просто указать на нужные мне функции
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
Gen345
Распознавание captcha это сложное дело.
Панацеи, и спец функций ту нет.
IMHO вам это не по силам.
 
Автор
G
Сообщения
35
Репутация
-1
Garrett сказал(а):
OffTopic:
Gen345
Распознавание captcha это сложное дело.
Панацеи, и спец функций ту нет.
IMHO вам это не по силам.

я уже сломал эту капчу 80% можно догнать до 95% она несложная но я хотел бы этап скрина обойти получая информацию о пикселях из памяти не выводя файл в окно программа с помощью которой я это сделал (кликерман) но меня функционал не устроил маловато а тут наоборот слишком много и не знаешь что надо вариантов море :smile:
я пока с библиотекой IE разбирался перебирая все функции времени много потратил а когда разобрался понял что 80% из них мне нафиг не нужны
и здесь я прошу указать мне направление а не написать за меня код там библиотека немереная и ваше все что связано с GUI и графикой там профи не всегда справится а о новичках и речи быть не может :smile:
 

qqww22

Новичок
Сообщения
115
Репутация
4
Код:
Include <GDIPlus.au3>

_GDIPlus_Startup()

Local Const $qSize = 50 ;Ширина/Высота квадрата
Local Const $qColor = 0xFF0000 ;Цвет квадрата
Local Const $iArea = 50 ; "квадратный" радиус поиска цветов
Local Const $aColors[3] = [ 2, 0xXXX, 0xXXX ] ;Цвета для поиска в регионе

Local $hImg, $iW, $iH, $tRes, $aPixel
; ---
$hImg = _GDIPlus_ImageLoadFromFile( ... ) ;Или скриншот
$iW = _GDIPlus_ImageGetWidth($hImg)
$iH = _GDIPlus_ImageGetHeight($hImg)

$tRes = _GDIPlus_BitmapLockBits($hImg, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)

$aPixel = _PixelSearch( $tRes, $cX, $cY, $cW, $cH, $qColor )


Пост автора.
http://autoit-script.ru/index.php?topic=19396.msg116089#msg116089
 
Автор
G
Сообщения
35
Репутация
-1
спасибо это то что нужно буду разбирать по полочкам если не пойму как работает значит рановато за такие вещи браться :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Gen345,
Дайте несколько примеров-картинок с капчей.
 

dstasv

Новичок
Сообщения
45
Репутация
1
Gen345 сказал(а):
спасибо это то что нужно буду разбирать по полочкам если не пойму как работает значит рановато за такие вещи браться :smile:
Учиться никогда не поздно
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Gen345
Вот еще старая тема, http://autoit-script.ru/index.php?topic=12847.0 про капчу, правда там простейшая. 2 цветная. Распознавалась прямо с памяти. В конце темы есть картинки, как она выглядит.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Gen345
изображение <...> вывести в 2D массив (матрицу) формат png
Код:
#include <GDIPlus.au3>

$sImage = @ScriptDir & '\test.png'

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($sImage)
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

Global $iIndex, $iSize = $iWidth * $iHeight, $aPixels[$iWidth][$iHeight]
$tBits = DllStructCreate('dword[' & $iSize & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $iSize, DllStructGetPtr($tBits))
For $j = 0 To $iHeight - 1
  For $i = 0 To $iWidth - 1
    $iIndex += 1
    $aPixels[$i][$j] = Hex(DllStructGetData($tBits, 1, $iIndex), 8)
  Next
Next

_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

#include <Array.au3>
_ArrayDisplay($aPixels, Default, "", 1)
 
Автор
G
Сообщения
35
Репутация
-1
madmasles сказал(а):
Gen345,
Дайте несколько примеров-картинок с капчей.

спс я уже разобрался во всем и сделал как мне надо написал нужные мне функции сейчас выложу прошу не ругать не программист я и много не понимаю мне главное результат и чтобы без ошибок работало
кароче смысл такой
1. в определенную папку сохраняется картинка если папки нет создается в директории скрипта
2. проверка наличия нужных файлов и никаких других другие не трогаются присвоение номера типа табельного
3. на основе изображения создается текстовый файл где пиксели отображены как мне надо и строки тоже в данном случае сделал поворот 90 градусов
(текстовый файл создается ток в том случае если имя определенного формата (0000) и расширение тоже учитывается любые другие файлы не трогаются текстовый файл создается для всех подходящих картинок по имени и расширению , если изображение не имеет пары автоматом создается хоть там 10к картинок :smile: , старые файлы не перезаписываются)
------------------------------
------------------------------
-------x-x--------------------
-----x-----x------------------
-------xx---x-----------------
---x--xxxx--x-x----xx---------
-----xxx-xx-xx-------xx-------
--x--xx---x----xxxx---xx------
--x--x----x---xxxxxxx--x------
-----x----x--xx-----x--xx-----
--x--x---x--xx------x--xx-----
--x--x------xx---------xx-----
--xx------x--x------x--xx-----
--xxx----xx--x------x--x------
---xxxxxxxx--xx-------xx------
-----xxxxx-x--xxx-xx--xx------
-----------xx--------xx-------
------------xx------xxx-------
-------------xxxxxxxxx--------
----------------xxxx----------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------xxx---
------------------------x-xx--
------------------------x--x--
-----------------------xx--x--
----------x---------xxx----xx-
-----------x-----xx--------xx-
--------x-xx-xx--------xxx--x-
-------------------xxxxx-x--x-
---------------xxxxxx----xxxx-
-----------xxxxxxx------------
-------xxxxxxx----------------
-------xxxx-------------------
------------------------------
--------x---------------------
------x--x--------------------
-----x--xx--------------------
----x--xxx--------xxxxxxx-----
---x--xxx-------xx------xx----
-----xxx-------x---------x----
--x--xx-------x--xxxxx--xx----
--x--x-------x--xxx--x--xx----
--x--x---------xxx---x--x-----
--x--x--------xxx----x--x-----
--x--xx---x--xxx-----x-xx-----
--xx---x----xxx--------xx-----
---xx------xxx---------xx-----
---xxxxxxxxxx-------x--x------
----xxxxxxx---------x--x------
--------------------x-xx------
--------------------x-xx------
------xxxx-----------xxx------
-----xxxxx--------------------
---xxxx--x--------------------
---xxx--xxxxx---------xxx-----
--xx----xxxxxxxxx-----x--x----
---x----------xxxxxxx-x--x----
--------x-----------xxx-------
------------xx----------x-----
----------------xxxx----x-----
---------------------x--x-----
--------------------xx--x-----
--------------------xx--------
---------------------xxx------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
------------------------------
Код:
Func _IEImageGetBinary($oImg)
    Local $canvas = $oImg.document.createElement("canvas")
    If Not IsObj($canvas) Then Return SetError(1, 0, 0)
    $canvas.width = $oImg.clientWidth
    $canvas.height = $oImg.clientHeight
    Local $ctx = $canvas.getContext('2d')
    $ctx.drawImage($oIMG, 0, 0)
    Local $rawData = $canvas.toDataURL()
    Local $a64Code = StringRegExp($rawData, '(?<=base64,).*$', 1)
    If Not IsArray($a64Code) Then Return SetError(2, 0, 0)
    Local $bData = _Base64Decode($a64Code[0])
    Return SetError(@error, 0, $bData)
EndFunc   ;==>_IEImageGetBinary
Func _Base64Decode($input_string)
    Local $struct = DllStructCreate("int")
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
            "str", $input_string, _
            "int", 0, _
            "int", 1, _
            "ptr", 0, _
            "ptr", DllStructGetPtr($struct, 1), _
            "ptr", 0, _
            "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(3, 0, "")
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", _
            "str", $input_string, _
            "int", 0, _
            "int", 1, _
            "ptr", DllStructGetPtr($a), _
            "ptr", DllStructGetPtr($struct, 1), _
            "ptr", 0, _
            "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(4, 0, "")
    Return DllStructGetData($a, 1)
EndFunc   ;==>_Base64Decode
Func _GetPixel( ByRef $tData, $X, $Y )
    Local $tBuf
    ; ---
    $tBuf = DllStructCreate( "dword Pixel", $tData.Scan0 + ($Y * $tData.Stride) + ($X * 0x04) )
    Return $tBuf.Pixel
EndFunc

Код:
Func _Example1($oImg)
    # Сохранение в файл
    Local $bData = _IEImageGetBinary($oImg)
    Local $FileList,$FileNomer = "0001",$n_1,$n_2 = 1,$n_3,$FileName,$extension = ".png"
    $FileName = $FileNomer&$extension
    If FileExists($Dir) Then
        $FileList = _FileListToArray($Dir,"*.png",1)
	If IsArray ($FileList) = 1 Then
        For $f_1 = 1  To $FileList[0]
            If StringLen($FileList[$f_1]) = 8 Then
                $n_1 = Int(StringLeft($FileList[$f_1],4))
                $n_2 +=1
                $n_3 = $n_2-1

				If StringLen ($n_2) = 1 Then
					$FileName = "000"&$n_2&$extension
				EndIf

				If StringLen ($n_2) = 2 Then
					$FileName = "00"&$n_2&$extension
				EndIf

				If StringLen ($n_2) = 3 Then
					$FileName = "0"&$n_2&$extension
				EndIf

				If StringLen ($n_2) = 4 Then
					$FileName = $n_2&$extension
				EndIf

				If $n_1 >= $n_2 Then

					If StringLen ($n_3) = 1 Then
						$FileName = "000"&$n_3&$extension
					EndIf

					If StringLen ($n_3) = 2 Then
						$FileName = "00"&$n_3&$extension
					EndIf

					If StringLen ($n_3) = 3 Then
						$FileName = "0"&$n_3&$extension
					EndIf

					If StringLen ($n_3) = 4 Then
						$FileName = $n_3&$extension
					EndIf				
					ExitLoop
				EndIf
                        EndIf
		Next
        EndIf
	
	Else
		DirCreate($Dir)
	EndIf
	    Local $hFile = FileOpen($FileName, 2 + 16)
	    FileWrite($hFile,$bData)
            FileClose($hFile)
	    FileMove(@WorkingDir & "\"&$FileName,@WorkingDir & "\Imade Script\"&$FileName,1+8)
EndFunc

Func _IEImadeFormatText()
If FileExists($Dir) Then
Local $FileList,$extension_1 = ".png",$extension_2 = ".txt",$f_1,$FileText,$FileText_1,$oDir_2,$FilePng
	$FileList = _FileListToArray($Dir,"*.png",1)
	If IsArray ($FileList) = 1 Then
		For $f_1 = 1  To $FileList[0]
			$FileText = ''
			$oDir_2 = ''
			$FilePng = ''
			$FileText_1 = ''
			If StringLen($FileList[$f_1]) = 8 Then
				$FileText = StringLeft($FileList[$f_1],4)&$extension_2
				$oDir_2 = $Dir&"\"&$FileText
				If FileExists($oDir_2) = 0 Then
					$FilePng = $Dir&"\"&$FileList[$f_1]
					_GDIPlus_Startup()
					Local $hImg, $iW, $iH, $tRes,$str,$str_2,$str_3
                                        $hImg = _GDIPlus_ImageLoadFromFile($FilePng) ;Или скриншот
					$iW = _GDIPlus_ImageGetWidth($hImg)
                                        $iH = _GDIPlus_ImageGetHeight($hImg)
                                        $tRes = _GDIPlus_BitmapLockBits($hImg, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
                                        If Not IsDllStruct($tRes) Then _
						Exit 1
						Dim $aCaptha[$iW][1]
							For $iX = 0  To $iW -1
                                                              $str = ""
                                                              $str_2 = ""
							      $str_3 = ""
							      For $iY = 0   To $iH -1
								    If Hex(  _GetPixel($tRes,$iX ,$iY),8) ==  "FFFFFFFF"  Then
									 $str = "-"
								    Else
									 $str = "x"
		                                                    EndIf
	                                                            $str_2 = $str_2&$str
							     Next
                                                             $str_3 = String($str_2)
							     $aCaptha[$iX][0] = $str_3
                                                      Next
				       _GDIPlus_BitmapUnlockBits($hImg, $tRes)
                                       _GDIPlus_ImageDispose($hImg)
                                       _GDIPlus_Shutdown()
					$FileText_1 = StringReplace($FilePng,$extension_1,$extension_2)
                                        If _FileCreate($FileText_1) = 1 Then
                                             _FileWriteFromArray($FileText_1,$aCaptha)
                                        EndIf
			    EndIf
		     EndIf
	      Next
       EndIf
EndIf
EndFunc
Код:
$oIE = _IECreate('http://, 1, 1, 1, 0)
For $s = 1 To 1000   ; количество  
Sleep(100)
Local $oForm = 0,$oIMGs = 0 ,$oImg = 0

If @error Then Exit 99
$oForm = _IEFormGetCollection($oIE, 0)
Sleep(500)
If  _IEImgClick($oForm,'Обновить',"alt" )= -1 Then
$oIMGs = _IEImgGetCollection($oIE)
For $oImg In $oIMGs
    If StringInStr($oImg.src,'captcha_1.php') Then
		Sleep(300)
		ExitLoop

    EndIf
Next
Sleep(1000)
_IEImageGetBinary($oImg)
Sleep(100)
_Example1($oImg)
Sleep(100)
_IEImadeFormatText()
EndIf

Next

шас быстро накатаю метод распознования и все единственное ручками базу заполнять придется и еще кучку функций написать чтоб заполнять базу новыми образцами :smile: в инклудах запутался физ знает какие надо у меня там куча их :smile:
З:Ы все работает норм без сбоев запутался в кнопках форума :( всем спс вопрос решенный я уже сам все доделаю :smile:
 

Вложения

  • 0001.png
    0001.png
    1.8 КБ · Просмотры: 170

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Gen345,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
G
Сообщения
35
Репутация
-1
madmasles сказал(а):
Gen345,
[warn]За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.[/warn]






вот же блин что значит отрывки если там одна функция из библиотеки это уже отрывок? спойлер чужие функции я тоже незнаю к аутоиту относится или нет укажите плиз :smile: или хотите я все в код Autoit запихаю )))
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Gen345,
Что конкретно непонятно в предупреждении?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Тема закрыта, автор неделю отдыхает.
 
Статус
Закрыто для дальнейших ответов.
Верх