
    %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    V/var/www/oz-panel.ru/ozpay-pub/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


Aq#"6"6
7C),s);&GWgw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;!NB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 Rd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sCd3KE43Jw'DdAsC,A,ACOO,STIAvFKKM3+<+<c>U>UVD  &DXe_%H	B ;%%a(
1ab1a&1Q3!*h:; 2JOOIr   c                 :    t        |       }|j                          y N)conv2pilrE   )r"   pilims     r   
show_imagerY   d   s    RLE	JJLr   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NN3vN&CLLN+227;;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)    ??8Aq$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    Ry	Rybz
)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    Ry		rbz.tBxj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
by4tCRy@AA3y>C""4:.HJJy*':ELL%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     ll3''GJJy)9ELL%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77DAqIIq!QlaI0IIq!QlaI0BGGALL!a%QAq1u-EL:BGGALL!a%QAq1u-GL<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$$		ZZ:2T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    ww}}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    
 WW'')
!!%(111a&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-WWXW@
 F#J/0@AL)
n%1(Aq6::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    99;(iikH$

6"AL/CLLDc'DIIK)?AYJJrN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    KK9K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    
 ii9i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"**c5;;">? ;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
EC
D
ECsC{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 LLU[[01	$			8	$
3) 
3	9 	y 	

 E 4) 4i 4	 I 45U[[01 
 <C <8
&'5bjj%++-. 52:: 5;rzz5;;./ ;EKK ; ".. 	 $'#3#3  5;; 3 3 5;; &8BJJ 88L%V L%^40 z	G r   