def snapshot(self, filename=None, ensure_orientation=True, quality=10, max_size=None): """ Take the screenshot of the display. The output is send to stdout by default. Args: filename: name of the file where to store the screenshot, default is None which is stdout ensure_orientation: True or False whether to keep the orientation same as display quality: The image quality, integer in range [1, 99] max_size: the maximum size of the picture, e.g 1200 Returns: screenshot output """ """default not write into file.""" if self.cap_method == CAP_METHOD.MINICAP_STREAM: self.rotation_watcher.get_ready() screen = self.minicap.get_frame_from_stream() elif self.cap_method == CAP_METHOD.MINICAP: screen = self.minicap.get_frame() elif self.cap_method == CAP_METHOD.JAVACAP: screen = self.javacap.get_frame_from_stream() else: screen = self.adb.snapshot() # output cv2 object try: screen = aircv.utils.string_2_img(screen) except Exception: # may be black/locked screen or other reason, print exc for debugging import traceback traceback.print_exc() return None # ensure the orientation is right if ensure_orientation and self.display_info["orientation"]: # minicap screenshots are different for various sdk_version if self.cap_method in ( CAP_METHOD.MINICAP, CAP_METHOD.MINICAP_STREAM) and self.sdk_version <= 16: h, w = screen.shape[:2] # cvshape是高度在前面!!!! if w < h: # 当前是横屏,但是图片是竖的,则旋转,针对sdk<=16的机器 screen = aircv.rotate(screen, self.display_info["orientation"] * 90, clockwise=False) # adb 截图总是要根据orientation旋转,但是SDK版本大于等于25(Android7.1以后)无需额外旋转 elif self.cap_method == CAP_METHOD.ADBCAP and self.sdk_version <= SDK_VERISON_ANDROID7: screen = aircv.rotate(screen, self.display_info["orientation"] * 90, clockwise=False) if filename: aircv.imwrite(filename, screen, quality, max_size=max_size) return screen
def snapshot(self, ensure_orientation=True): screen = super(AdbCap, self).snapshot() if ensure_orientation and self.adb.sdk_version <= SDK_VERISON_ANDROID7: screen = aircv.rotate(screen, self.adb.display_info["orientation"] * 90, clockwise=False) return screen
def snapshot(self, ensure_orientation=True, *args, **kwargs): """ Take a screenshot and convert it into a cv2 image object 获取一张屏幕截图,并转化成cv2的图像对象 !!! 注意,该方法拿到的截图可能不是队列中最新的,除非一直在消费队列中的图像,否则可能会是过往图像内容,请谨慎使用 Args: ensure_orientation: True or False whether to keep the orientation same as display Returns: numpy.ndarray """ screen = self.get_frame_from_stream() try: screen = aircv.utils.string_2_img(screen) except Exception: # may be black/locked screen or other reason, print exc for debugging traceback.print_exc() return None if ensure_orientation: if self.ori_function: display_info = self.ori_function() orientation = next(key for key, value in ROTATION_MODE.items() if value == display_info["orientation"]) screen = aircv.rotate(screen, -orientation, clockwise=False) return screen
def snapshot(self, strType=False, filename=None, ensure_orientation=True): """ take snapshot filename: save screenshot to filename """ data = None if self.cap_method == CAP_METHOD.MINICAP: raise NotImplementedError elif self.cap_method == CAP_METHOD.MINICAP_STREAM: raise NotImplementedError elif self.cap_method == CAP_METHOD.WDACAP: data = self._neo_wda_screenshot() # wda 截图不用考虑朝向 if strType: if filename: with open(filename, 'wb') as f: f.write(data) return data # output cv2 object try: screen = aircv.utils.string_2_img(data) except: # may be black/locked screen or other reason, print exc for debugging import traceback traceback.print_exc() return None now_orientation = self.orientation # ensure the orientation is right if ensure_orientation and now_orientation in [LANDSCAPE, LANDSCAPE_RIGHT]: # minicap screenshots are different for various sdk_version if self.cap_method in (CAP_METHOD.MINICAP, CAP_METHOD.MINICAP_STREAM) and self.sdk_version <= 16: h, w = screen.shape[:2] # cvshape是高度在前面!!!! if w < h: # 当前是横屏,但是图片是竖的,则旋转,针对sdk<=16的机器 screen = aircv.rotate(screen, self.display_info["orientation"] * 90, clockwise=False) # wda 截图是要根据orientation旋转 elif self.cap_method == CAP_METHOD.WDACAP: # seems no need to rotate now pass #screen = aircv.rotate(screen, 90, clockwise= (now_orientation == LANDSCAPE_RIGHT) ) # readed screen size h, w = screen.shape[:2] # save last res for portrait if now_orientation in [LANDSCAPE, LANDSCAPE_RIGHT]: self._size['height'] = w self._size['width'] = h else: self._size['height'] = h self._size['width'] = w winw, winh = self.window_size() self._touch_factor = float(winh) / float(h) # save as file if needed if filename: aircv.imwrite(filename, screen) return screen