@@ -42,26 +42,38 @@ class ScreenshotExtesion(AbstractDevice):
4242 def __init__ (self ):
4343 self .__framebuffer_ok = True
4444
45- def screenshot (self ) -> Image .Image :
45+ def screenshot (self , display_id : Optional [ int ] = None ) -> Image .Image :
4646 """ Take a screenshot and return PIL.Image.Image object
47- If capture failed, return a black image
47+ Args:
48+ display_id: int, default None, see "dumpsys SurfaceFlinger --display-id" for valid display IDs
49+
50+ Returns:
51+ PIL.Image.Image object, If capture failed, return a black image
4852 """
4953 try :
50- pil_image = self .__screencap ()
54+ pil_image = self .__screencap (display_id )
5155 if pil_image .mode == "RGBA" :
5256 pil_image = pil_image .convert ("RGB" )
5357 return pil_image
5458 except UnidentifiedImageError as e :
5559 wsize = self .window_size ()
5660 return Image .new ("RGB" , wsize , (0 , 0 , 0 ))
5761
58- def __screencap (self ) -> Image .Image :
59- if self .__framebuffer_ok :
60- try :
61- return self .framebuffer ()
62- except NotImplementedError :
63- self .__framebuffer_ok = False
64- except UnidentifiedImageError as e :
65- logger .warning ("framebuffer error: %s" , e )
66- png_bytes = self .shell ('screencap -p' , encoding = None )
62+ def __screencap (self , display_id : int = None ) -> Image .Image :
63+ """ Take a screenshot and return PIL.Image.Image object
64+ """
65+ # framebuffer is not stable, so we disable it
66+ # MemoryError may occur when using framebuffer
67+
68+ # if self.__framebuffer_ok and display_id is None:
69+ # try:
70+ # return self.framebuffer()
71+ # except NotImplementedError:
72+ # self.__framebuffer_ok = False
73+ # except UnidentifiedImageError as e:
74+ # logger.warning("framebuffer error: %s", e)
75+ cmdargs = ['screencap' , '-p' ]
76+ if display_id is not None :
77+ cmdargs .extend (['-d' , str (display_id )])
78+ png_bytes = self .shell (cmdargs , encoding = None )
6779 return Image .open (io .BytesIO (png_bytes ))
0 commit comments