Ë
    ¾�jì(  ã                   ón  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZmZ d dlmZ d dlZej                  ej(                  ej                  f   ZeZ ej.                  e«      Zdefd„Zdedefd	„Zd#d
ej(                  defd„Zd$dedefd„Zd%dedefd„Zd
eej(                  ej                  f   fd„Zdej(                  fd„Z d&de!fd„Z"d„ Z#d„ Z$d„ Z%d
eej(                  ej                  f   dej(                  fd„Z&d
eej(                  ej                  f   dej                  fd„Z'ejP                  fd„Z)ejP                  fde!fd„Z*d
ej                  de+de+dej                  fd„Z,dej(                  fd„Z- G d„ d e.«      Z/d!„ Z0ed"k(  r e0«        yy)'é    N)ÚUnion)ÚImageÚ	ImageDraw)Ústructural_similarityÚimagec                 óª   — t        | «      rt        | «      } t        | j                  «      dk(  r| S t	        j
                  | t        j                  «      S )zB change color image to gray
    Returns:
        opencv-image
    é   )ÚispilÚpil2cvÚlenÚshapeÚcv2ÚcvtColorÚCOLOR_BGR2GRAY)r   s    úS/var/www/api.ozpay.ru/ozpay/venv/lib/python3.12/site-packages/uiautomator2/image.pyÚcolor_bgr2grayr      sA   € ô
 ˆU„|Ü�u“ˆä
ˆ5�;‰;Ó˜1ÒØˆÜ�<‰<˜œs×1Ñ1Ó2Ð2ó    Úimage_aÚimage_bc                 ó°   — t        | «      }t        |«      }t        j                  ||t        j                  «      }t        j                  |«      \  }}}}|S )z–
    Refs:
        https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html
    )r   r   ÚmatchTemplateÚTM_CCOEFF_NORMEDÚ	minMaxLoc)	r   r   ÚaÚbÚresÚmin_valÚmax_valÚmin_locÚmax_locs	            r   Útemplate_ssimr!   ,   sN   € ô
 	�wÓ€AÜ�wÓ€AÜ
×
Ñ
˜A˜q¤#×"6Ñ"6Ó
7€CÜ),¯©°sÓ);Ñ&€GˆW�g˜wØ€Nr   ÚimÚboundsc                 óR   — |s| S t        |«      dk(  sJ ‚|\  }}}}| ||…||…f   }|S )Né   )r   )r"   r#   ÚlxÚlyÚrxÚryÚcrop_imgs          r   Úcv2cropr+   8   sD   € ÙØˆ	Üˆv‹;˜!ÒÐÐà�N€BˆˆB�Ø�"�R�%˜˜B˜�,Ñ€HØ€Or   c                 óz   — t        | «      }t        |«      }t        ||«      }t        ||«      }t        |||¬«      S )N©Úfull)r   r+   r   )r   r   r.   r#   r   r   ÚcaÚcbs           r   Úcompare_ssimr1   B   s=   € Ü�wÓ€AÜ�wÓ€AÜ	��FÓ	€BÜ	��FÓ	€BÜ   R¨dÔ3Ð3r   c                 óž  — t        | «      t        |«      }}t        ||d¬«      \  }}|dz  j                  d«      }t        j                  |ddt        j
                  t        j                  z  «      \  }}t        j                  |j                  «       t        j                  t        j                  «      }	t        j                  |	«      }	t        t        |«      «      }
|j                  «       }|	D ]?  }t        j                  |«      \  }}}}t        j                   |||f||z   ||z   f|
d«       ŒA t#        |«      j%                  «        |S )zÙ
    Args:
        image_a, image_b: opencv image or PIL.Image
        color: (r, g, b) eg: (255, 0, 0) for red

    Refs:
        https://www.pyimagesearch.com/2017/06/19/image-difference-with-opencv-and-python/
    Tr-   éÿ   Úuint8r   r	   )Úconv2cvr1   Úastyper   Ú	thresholdÚTHRESH_BINARY_INVÚTHRESH_OTSUÚfindContoursÚcopyÚRETR_EXTERNALÚCHAIN_APPROX_SIMPLEÚimutilsÚgrab_contoursÚtupleÚreversedÚboundingRectÚ	rectangleÚcv2pilÚshow)r   r   ÚcolorÚimaÚimbÚscoreÚdiffÚ_ÚthreshÚcntsÚcv2colorr"   ÚcÚxÚyÚwÚhs                    r   Úcompare_ssim_debugrT   J   s  € ô �wÓ¤¨Ó!1ˆ€CÜ˜s C¨dÔ3�K€Eˆ4Ø�3‰J×Ñ˜wÓ'€DÜ—‘˜d A s¬C×,AÑ,AÄCÇOÁOÑ,SÓT�I€A€vÜ×Ñ˜FŸK™K›M¬3×+<Ñ+<¼c×>UÑ>UÓV€DÜ× Ñ  Ó&€Dä”X˜e“_Ó%€HØ	�‰‹€BØò ;ˆÜ×%Ñ% aÓ(‰
ˆˆ1ˆa�Ü�‰�b˜1˜a˜& 1 Q¡3¨¨!© *¨h¸Õ:ð;ô ˆ2ƒJ‡O�OÔØ€Ir   c                 ó:   — t        | «      }|j                  «        y ©N)Úconv2pilrE   )r"   Úpilims     r   Ú
show_imagerY   d   s   € Ü�R‹L€EØ	‡J�J…Lr   Úreturnc                 óŒ   — | j                  d«      } t        j                  | «      }|dd…dd…ddd…f   j                  «       }|S )z% Convert from pillow image to opencv ÚRGBNéÿÿÿÿ)ÚconvertÚnpÚarrayr;   )Ú	pil_imageÚ	cv2_images     r   r   r   i   sE   € ð ×!Ñ! %Ó(€IÜ—‘˜Ó#€Iàš!šQ¡ " ˜*Ñ%×*Ñ*Ó,€IØÐr   c                 ó´   — t        j                  «       }| j                  ||¬«       t        j                  |j                  «       «      j                  d«      S )z  Convert pillow image to base64 ©Úformatzutf-8)ÚioÚBytesIOÚsaveÚbase64Ú	b64encodeÚgetvalueÚdecode)ra   re   Úbufs      r   Ú
pil2base64rn   s   s?   € ä
�*‰*‹,€CØ‡N�N�3˜v€NÔ&Ü×Ñ˜CŸL™L›NÓ+×2Ñ2°7Ó;Ð;r   c                 ób   — t        j                  | dd…dd…ddd…f   j                  «       «      S )z  Convert opencv to pillow image Nr]   )r   Ú	fromarrayr;   )Úcv_images    r   rD   rD   z   s)   € ä�?‰?˜8¢A¢q©$¨B¨$ JÑ/×4Ñ4Ó6Ó7Ð7r   c                 ó6   — t        | t        j                  «      S rV   )Ú
isinstancer_   Úndarray©r"   s    r   Úiscv2rv      s   € Ü�bœ"Ÿ*™*Ó%Ð%r   c                 ó6   — t        | t        j                  «      S rV   )rs   r   ru   s    r   r
   r
   ƒ   s   € Ü�bœ%Ÿ+™+Ó&Ð&r   c                 ór   — t        | «      r| S t        | «      rt        | «      S t        dt	        | «      «      ‚)NzUnknown image type:)rv   r
   r   Ú	TypeErrorÚtyperu   s    r   r5   r5   ‡   s1   € ÜˆR„yØˆ	ÜˆR„yÜ�b‹zÐÜ
Ð)¬4°«8Ó
4Ð4r   c                 óv   — t        | «      r| S t        | «      rt        | «      S t        dt	        | «      › �«      ‚)NzUnknown image type: )r
   rv   rD   ry   rz   ru   s    r   rW   rW   �   s6   € ÜˆR„yØˆ	Ü	ˆrŒÜ�b‹zÐäÐ.¬t°B«x¨jÐ9Ó:Ð:r   c                 ó  — | j                  d«      }|dk(  rt        d| d d z  «      ‚|t        d«      z  }t        j                  | |d  «      }t        j                  t        |«      d¬«      }t        j                  ||«      }|S )Nzbase64,r]   zdata url is invalid, head %sé   r4   ©Údtype)
ÚfindÚIOErrorr   ri   Údecodestringr_   ÚasarrayÚ	bytearrayr   Úimdecode)ÚdataÚflagÚposÚraw_datar   s        r   Ú_open_data_urlrŠ   ˜   s|   € Ø
�)‰)�IÓ
€CØ
ˆb‚yÜÐ4°t¸C¸R°yÑ@ÓAÐAàŒ3ˆy‹>Ñ€CÜ×"Ñ" 4¨¨ :Ó.€HÜ�J‰J”y Ó*°'Ô:€EÜ�L‰L˜ Ó%€EØ€Lr   Úurlc                 ó°   — t        j                  | «      j                  }t        j                  t        |«      d¬«      }t        j                  ||«      }|S )zZ download the image, convert it to a NumPy array, and then read
    it into OpenCV format r4   r~   )ÚrequestsÚgetÚcontentr_   rƒ   r„   r   r…   )r‹   r‡   r�   r   s       r   Ú_open_image_urlr�   ¤   sB   € ô �l‰l˜3Ó×'Ñ'€GÜ�J‰J”y Ó)°Ô9€EÜ�L‰L˜ Ó%€EØ€Lr   rP   rQ   c                 óœ  — t        j                  | «      }| j                  \  }}|j                  |d||fdd¬«       |j                  d|||fdd¬«       t	        | j                  «      dz  }|j                  ||z
  ||z
  ||z   ||z   fd¬«       t	        | j                  «      dz  }|j                  ||z
  ||z
  ||z   ||z   fd¬«       ~| S )	zW
    Mark position to show which point clicked

    Args:
        im: pillow.Image
    r   Úredé   )ÚfillÚwidthé(   )r”   é2   Úwhite)r   ÚDrawÚsizeÚlineÚminÚellipse)r"   rP   rQ   ÚdrawrR   rS   Úrs          r   Ú
draw_pointr    ­   sÑ   € ô �>‰>˜"Ó€DØ�7‰7�D€A€qØ‡I�Iˆq�!�Q˜ˆl ¨a€IÔ0Ø‡I�Iˆq�!�Q˜ˆl ¨a€IÔ0ÜˆB�G‰G‹˜Ñ€AØ‡L�L�!�a‘%˜˜Q™  A¡ q¨1¡uÐ-°E€LÔ:ÜˆB�G‰G‹˜Ñ€AØ‡L�L�!�a‘%˜˜Q™  A¡ q¨1¡uÐ-°G€LÔ<ØØ€Ir   c                 ó¦  — t        | t        j                  «      r| S t        | t        j                  «      rt	        | «      S | j                  d«      rt        | «      S t        j                  d| «      rt        | «      S t        j                  j                  | «      r't        j                  | «      }|€t        d| z  «      ‚|S t        d| z  «      ‚)z•
    Args:
        data: local path or http url or data:image/base64,xxx
    
    Returns:
        opencv image
    
    Raises:
        IOError
    zdata:image/z
^https?://zImage format error: %szimage read invalid data: %s)rs   r_   rt   r   r   Ú
startswithrŠ   ÚreÚmatchr�   ÚosÚpathÚisfiler   Úimreadr�   )r†   r"   s     r   r¨   r¨   À   s©   € ô �$œŸ
™
Ô#ØˆÜ	�Dœ%Ÿ+™+Ô	&Ü�d‹|ÐØ	�‰˜Ô	'Ü˜dÓ#Ð#Ü	�‰�- Ô	&Ü˜tÓ$Ð$Ü	�‰�‰˜Ô	Ü�Z‰Z˜ÓˆØˆ:ÜÐ2°TÑ9Ó:Ð:Øˆ	ä
Ð/°$Ñ6Ó
7Ð7r   c                   óx   — e Zd Zd
d„Zd„ Zd„ Zdeej                  e	e
j                  f   fd„Zdd„Zdd„Zdd„Zy	)ÚImageXc                 óJ   — || _         t        |d«      sJ ‚t        |d«      sJ ‚y)z=
        Args:
            d (uiautomator2 instance)
        ÚclickÚ
screenshotN)Ú_dÚhasattr)ÚselfÚds     r   Ú__init__zImageX.__init__Ý   s+   € ð
 ˆŒÜ�q˜'Ô"Ð"Ð"Ü�q˜,Ô'Ð'Ñ'r   c                 ó:   — | j                   j                  ||«      S rV   )r®   r¬   )r°   rP   rQ   s      r   Ú
send_clickzImageX.send_clickæ   s   € Ø�w‰w�}‰}˜Q Ó"Ð"r   c                 óz   — | j                   j                  «       }|j                  d«      j                  ||f«      S )z0
        Returns:
            (r, g, b)
        r\   )r®   r­   r^   Úgetpixel)r°   rP   rQ   r­   s       r   r¶   zImageX.getpixelé   s6   € ð
 —W‘W×'Ñ'Ó)ˆ
Ø×!Ñ! %Ó(×1Ñ1°1°a°&Ó9Ð9r   Úimdatac                 ór  — t        |«      }t        j                  dgdd¬«      }|j                  d|¬«       |j                  dd \  }}| j
                  j                  d¬	«      }t        |t        j                  «      sJ d
«       ‚|j                  d|¬«      }|d   d   d   }|d   }	|d   \  }
}|	|
|gdœS )z�
        Args:
            imdata: file, url, pillow or opencv image object
        
        Returns:
            templateMatch result
        Útemplate)çÍÌÌÌÌÌì?gš™™™™™ñ?é   T)ÚengineÚengine_template_scaleÚpro_mode)Ú
pic_objectNr	   Úopencvrd   zscreenshot is not opencv formatÚtarget)Útarget_pic_objectr†   ÚTemplateEngineÚ
target_simÚtarget_point)Ú
similarityÚpoint)r¨   ÚfinditÚFindItÚload_templater   r®   r­   rs   r_   rt   r€   )r°   r·   ÚcvimageÚfiÚthÚtwrÁ   Ú
raw_resultÚresultrÄ   rP   rQ   s               r   r¤   zImageX.matchñ   sÏ   € ô ˜“.ˆÜ�]‰] : ,Ø1>Ø$(ô*ˆð 	×Ñ˜°ÐÔ8Ø—‘˜r Ð"‰ˆˆBà—‘×#Ñ#¨8Ð#Ó4ˆÜ˜&¤"§*¡*Ô-ÐPÐ/PÓPÐ-Ø—W‘W˜X¸�WÓ@ˆ
ð ˜FÑ# JÑ/Ð0@ÑAˆà˜LÑ)ˆ
Ø�nÑ%‰ˆˆ1à(°A°q°6Ñ:Ð:r   c                 óJ  — t        j                   «       |z   }t        j                   «       |k  r`| j                  |«      }|d   }t        j                  d|||t        j                   «       z
  «       ||k  rŒ`t        j                  d«       |S t        j                  d«       y )NrÆ   z)similarity %.2f [~%.2f], left time: %.1fsgš™™™™™¹?zimage not found)Útimer¤   ÚloggerÚdebugÚsleep)r°   r·   Útimeoutr7   ÚdeadlineÚmÚsims          r   Ú__waitzImageX.__wait  s€   € Ü—9‘9“; Ñ(ˆÜ�i‰i‹k˜HÒ$Ø—
‘
˜6Ó"ˆAØ�L‘/ˆCÜ�L‰LÐDÀcØ'¨´D·I±I³KÑ)?ôAà�YŠØÜ�J‰J�rŒNØˆHÜ�‰Ð&Õ'r   c                 ó.   — | j                  |||¬«      }|S )z wait until image show up ©rÖ   r7   )Ú_ImageX__wait)r°   r·   rÖ   r7   rØ   s        r   ÚwaitzImageX.wait  s   € à�K‰K˜¨¸9ˆKÓEˆØˆr   c                 óx   — | j                  |||¬«      }|€t        d«      ‚|d   \  }}| j                  ||«      S )zT
        Args:
            imdata: file, url, pillow or opencv image object
        rÜ   zimage object not foundrÇ   )rÞ   ÚRuntimeErrorr´   )r°   r·   rÖ   r7   r   rP   rQ   s          r   r¬   zImageX.click  sG   € ð
 �i‰i˜¨¸9ˆiÓEˆØˆ;ÜÐ7Ó8Ð8Ø�7‰|‰ˆˆ1Ø�‰˜q !Ó$Ð$r   N)r±   zuiautomator2.Device)ç      >@gš™™™™™é?)rá   rº   )Ú__name__Ú
__module__Ú__qualname__r²   r´   r¶   r   r_   rt   Ústrr   r¤   rÝ   rÞ   r¬   © r   r   rª   rª   Ü   s@   „ ó(ò#ò:ð;˜E "§*¡*¨c°5·;±;Ð">Ñ?ó ;ó8(óô
	%r   rª   c                  óL   — t        d«      } t        d«      }t        | |d¬«       y )Nz1http://localhost:17310/widgets/00006/template.jpgz1http://localhost:17310/widgets/00007/template.jpg)r   r   r3   )rF   )	r¨   rT   r   ÚprintrD   rš   rÈ   rÉ   rÊ   )rG   rH   r"   ÚpimÚtaobaorÌ   s         r   Ú_mainrë   +  s'   € Ü
ÐDÓ
E€CÜ
ÐDÓ
E€CÜ�s˜C {Õ3Ø
r   Ú__main__rV   )FN))r3   r   r   )ÚJPEG)1ri   rf   Úloggingr¥   r£   rÒ   Útypingr   r   rÈ   r>   Únumpyr_   r�   ÚPILr   r   Úskimage.metricsr   Úuiautomator2rt   Ú	ImageTyper1   Ú	getLoggerrâ   rÓ   r   r!   r@   r+   rT   rY   r   rå   rn   rD   rv   r
   r5   rW   ÚIMREAD_COLORrŠ   r�   Úintr    r¨   Úobjectrª   rë   ræ   r   r   ú<module>rù      sè  ðó Û 	Û Û 	Û 	Û Û Ý ã 
Û Û Û Û ß  Ý 1ã à�L‰L˜Ÿ™ U§[¡[Ð0Ñ1€	à$€Ø	ˆ×	Ñ	˜8Ó	$€ð
3˜)ó 
3ð	˜9ð 	¨yó 	ñ�—
‘
ð  Eó ñ4˜)ð 4¨ió 4ñ 	ð °Ió ð4�5˜Ÿ™ U§[¡[Ð0Ñ1ó ð
˜Ÿ™ó ñ<¨Có <ò8ò
&ò'ð5��b—j‘j %§+¡+Ð-Ñ.ð 5°2·:±:ó 5ð;��r—z‘z 5§;¡;Ð.Ñ/ð ;°E·K±Kó ;ð "×.Ñ.ó 	ð $'×#3Ñ#3ñ ˜ó ð�5—;‘;ð  3ð ¨3ð °5·;±;ó ð&8�B—J‘Jó 8ô8L%ˆVô L%ò^4ð0 ˆzÒÙ	…Gð r   