def simple(scale=0.5): adb.use_openstf() img = adb.screenshot(format='cv2') while img is None: time.sleep(1) img = adb.screenshot(format='cv2') print 'Press Ctrl-C or Esc to quit.' winname = 'Sync Screen' cv2.namedWindow(winname) while True: try: img = adb.screenshot(format='cv2', scale=scale) cv2.imshow(winname, img) key = cv2.waitKey(10) if key == 27: # Escape break except KeyboardInterrupt: print 'Done' break except: traceback.print_exc() break cv2.destroyWindow(winname)
def main(host=None, port=None, serial=None, out='screenshot.png', method='minicap'): """ If minicap not avaliable then use uiautomator instead Disable scale for now. Because -s scale is conflict of -s serial """ adb.use(serial, host, port) # correct screencap method if not adb.is_file_exists( '/data/local/tmp/minicap') and method == 'minicap': method = 'uiautomator' if method == 'minicap': try: adb.screenshot_minicap(filename=out, scale=1.0) print 'File saved to "%s"' % out return except EnvironmentError: print 'minicap not available, use uiautomator instead.' method = 'uiautomator' if method == 'uiautomator': print 'Screenshot method use uiautomator' adb.use_uiautomator() adb.screenshot(filename=out, scale=1.0) print 'File saved to "%s"' % out return print 'method invalid: %s' % method
def main(host=None, port=None, serial=None, out='screenshot.png', method='minicap'): """ If minicap not avaliable then use uiautomator instead Disable scale for now. Because -s scale is conflict of -s serial """ adb.use(serial, host, port) # correct screencap method if not adb.is_file_exists('/data/local/tmp/minicap') and method == 'minicap': method = 'uiautomator' if method == 'minicap': try: adb.screenshot_minicap(filename=out, scale=1.0) print 'File saved to "%s"' % out return except EnvironmentError: print 'minicap not available, use uiautomator instead.' method = 'uiautomator' if method == 'uiautomator': print 'Screenshot method use uiautomator' adb.use_uiautomator() adb.screenshot(filename=out, scale=1.0) print 'File saved to "%s"' % out return print 'method invalid: %s' % method
def screen_simple(scale=0.5): adb.use_openstf() img = adb.screenshot(format='cv2') while img is None: time.sleep(1) img = adb.screenshot(format='cv2') print 'Press Ctrl-C or Esc to quit.' winname = 'Sync Screen' cv2.namedWindow(winname) while True: try: img = adb.screenshot(format='cv2', scale=scale) cv2.imshow(winname, img) key = cv2.waitKey(10) if key == 27: # Escape break except KeyboardInterrupt: print 'Done' break except: traceback.print_exc() break cv2.destroyWindow(winname)
def _refresh_screen(self): self.image = adb.screenshot(scale=scale) self.tkimage = ImageTk.PhotoImage(self.image) w, h = self.image.size self.canvas.config(width=w, height=h) if self.canvas_image is None: self.canvas_image = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tkimage) else: self.canvas.itemconfig(self.canvas_image, image=self.tkimage) self.root.after(10, self._refresh_screen)
def _refresh_screen(self): self.image = adb.screenshot(scale=scale) self.tkimage = ImageTk.PhotoImage(self.image) w, h = self.image.size self.canvas.config(width=w, height=h) if self.canvas_image is None: self.canvas_image = self.canvas.create_image( 0, 0, anchor=tk.NW, image=self.tkimage) else: self.canvas.itemconfig(self.canvas_image, image=self.tkimage) self.root.after(10, self._refresh_screen)
def main(scale=0.5): adb.use_openstf() img = adb.screenshot() while img is None: time.sleep(1) img = adb.screenshot() while True: try: img = adb.screenshot() h, w = img.shape[:2] h, w = int(h*scale), int(w*scale) img = cv2.resize(img, dsize=(w, h)) cv2.imshow('screen', img) cv2.waitKey(10) except KeyboardInterrupt: print 'Done' break except: traceback.print_exc() break
def main(output='out.avi', scale=0.5, portrait=False, overwrite=True, verbose=True): if os.path.exists(output): print 'output file exists!' if overwrite: print 'overwriting', output os.remove(output) else: return adb.use_openstf() img = adb.screenshot() while img is None: time.sleep(1) img = adb.screenshot() if verbose: cv2.imshow('screen', img) w, h = adb.display() w, h = int(w * scale), int(h * scale) framesize = (w, h) if portrait else (h, w) fps = 24.0 # refs http://www.fourcc.org/codecs.php # avaiable fourccs: XVID, MJPG fourcc = cv2.cv.FOURCC(*'MJPG') writer = cv2.VideoWriter(output, fourcc, fps, framesize) # video (width, height), images should be resized to fit in video frame. vw, vh = framesize tic = time.clock() toc = time.clock() while True: try: time.sleep(1.0 / fps - max(toc - tic, 0)) tic = time.clock() img = adb.screenshot() h, w = img.shape[:2] if h * vw == w * vh: h, w = vh, vw frame = cv2.resize(img, dsize=(w, h)) else: frame = np.zeros((vh, vw, 3), dtype=np.uint8) sh = vh * 1.0 / h sw = vw * 1.0 / w if sh < sw: h, w = vh, int(sh * w) else: h, w = int(sw * h), vw left, top = (vw - w) / 2, (vh - h) / 2 frame[top:top + h, left:left + w, :] = cv2.resize(img, dsize=(w, h)) writer.write(frame) toc = time.clock() if verbose: cv2.imshow('screen', frame) cv2.waitKey(1) except KeyboardInterrupt: print 'Done' break except: traceback.print_exc() break writer.release()
def main(output="out.avi", scale=0.5, portrait=False, overwrite=True, verbose=True): if os.path.exists(output): print "output file exists!" if overwrite: print "overwriting", output os.remove(output) else: return adb.use_openstf() img = adb.screenshot(format="cv2") while img is None: time.sleep(1) img = adb.screenshot(format="cv2") if verbose: cv2.imshow("screen", img) w, h = adb.display() w, h = int(w * scale), int(h * scale) framesize = (w, h) if portrait else (h, w) fps = 24.0 # refs http://www.fourcc.org/codecs.php # avaiable fourccs: XVID, MJPG fourcc = cv2.cv.FOURCC(*"MJPG") writer = cv2.VideoWriter(output, fourcc, fps, framesize) # video (width, height), images should be resized to fit in video frame. vw, vh = framesize tic = time.clock() toc = time.clock() while True: try: time.sleep(1.0 / fps - max(toc - tic, 0)) tic = time.clock() img = adb.screenshot(format="cv2") h, w = img.shape[:2] if h * vw == w * vh: h, w = vh, vw frame = cv2.resize(img, dsize=(w, h)) else: frame = np.zeros((vh, vw, 3), dtype=np.uint8) sh = vh * 1.0 / h sw = vw * 1.0 / w if sh < sw: h, w = vh, int(sh * w) else: h, w = int(sw * h), vw left, top = (vw - w) / 2, (vh - h) / 2 frame[top : top + h, left : left + w, :] = cv2.resize(img, dsize=(w, h)) writer.write(frame) toc = time.clock() if verbose: cv2.imshow("screen", frame) cv2.waitKey(1) except KeyboardInterrupt: print "Done" break except: traceback.print_exc() break writer.release()
def gui(scale=0.5): from PIL import Image, ImageTk import Tkinter as tk import tkFileDialog class Screen(object): def __init__(self): self.root = tk.Tk() self.root.title('Sync Screen') # self.image = Image.open(os.path.join(__dir__, 'static', 'screen.png')) self.image = None self.tkimage = None self.canvas_image = None self.make_toolbar() self.make_canvas() def make_toolbar(self): # tools: capture, power, home, menu, back, volume_up, volume_down, turn_screen, keymapping_settings toolbar = tk.Frame(self.root) self.icons = [] # need to keep a reference for tk images. wtf. def capture(): if self.image is None: print 'Not initialized, try later.' return d = tkFileDialog.asksaveasfilename( filetypes=(('Images', '*.png;*.jpg;'), ), initialfile='screen.png') if not d: # canceled return if not d.endswith('.png') and not d.endswith('.jpg'): d += '.png' print 'Save to', d self.image.save(d) icon = ImageTk.PhotoImage( file=os.path.join(__dir__, 'static', 'icons', 'save.ico')) tk.Button(toolbar, image=icon, command=capture).pack(side=tk.LEFT, padx=2, pady=2) self.icons.append(icon) # def rotate(): # print 'rotate screen (Not Implemented yet.)' # icon = ImageTk.PhotoImage(file=os.path.join(__dir__, 'static', 'icons', 'rotate.ico')) # tk.Button(toolbar, image=icon, command=rotate).pack(side=tk.LEFT, padx=2, pady=2) # self.icons.append(icon) for key in ('power', 'home', 'menu', 'back', 'volume_up', 'volume_down'): icon = ImageTk.PhotoImage( file=os.path.join(__dir__, 'static', 'icons', '%s.ico' % key)) self.icons.append(icon) b = tk.Button(toolbar, image=icon, command=lambda k=key: adb.keyevent('KEYCODE_%s' % k.upper())) b.pack(side=tk.LEFT, padx=2, pady=2) toolbar.pack(side=tk.TOP, fill=tk.X) def make_canvas(self): # screen canvas, bind mouse input & keyboard input self.canvas = tk.Canvas(self.root, bg='black', bd=0, highlightthickness=0) self.canvas.pack() def _screen2touch(w, h, x, y): '''convert touch position''' ori = adb.orientation() if ori == 0: return x, y elif ori == 1: # landscape-right return w - y, x elif ori == 2: # upsidedown return w - x, h - y elif ori == 3: # landscape-left return h - x, y return x, y w, h = adb.display() screen2touch = partial(_screen2touch, w, h) def on_mouse_down(event): self.canvas.focus_set() x, y = int(event.x / scale), int(event.y / scale) x, y = screen2touch(x, y) adb._mini.touchqueue.put('d 0 %d %d 30\nc\n' % (x, y)) def on_mouse_up(event): adb._mini.touchqueue.put('u 0\nc\n') def on_mouse_drag(event): x, y = int(event.x / scale), int(event.y / scale) x, y = screen2touch(x, y) adb._mini.touchqueue.put('m 0 %d %d 30\nc\n' % (x, y)) self.canvas.bind('<ButtonPress-1>', on_mouse_down) self.canvas.bind('<ButtonRelease-1>', on_mouse_up) self.canvas.bind('<B1-Motion>', on_mouse_drag) keymap = { '\r': 'KEYCODE_ENTER', ' ': 'KEYCODE_SPACE', '\x08': 'KEYCODE_DEL', } def on_key(event): c = event.char # print 'key pressed', repr(c), type(c) if c in 'adbcdefghijklmnopqrstuvwxyz0123456789': adb.input(c) return 'break' if c in keymap: adb.keyevent(keymap[c]) return 'break' self.canvas.bind('<Key>', on_key) # def refresh_screen(self, screen): # # refresh rate is about 0.03 second, cause flickering # if screen is None: # return # t0 = time.time() # h, w = screen.shape[:2] # w, h = int(w*scale), int(h*scale) # screen = cv2.resize(screen, (w, h)) # self.image = Image.fromarray(screen[:, :, ::-1]) # self.tkimage = ImageTk.PhotoImage(self.image) # # # thumbnail is slow... around 0.16 second # # w, h = self.image.size # # image = self.image.copy() # # image.thumbnail((w, h), Image.ANTIALIAS) # # self.tkimage = ImageTk.PhotoImage(image) # self.canvas.config(width=w, height=h) # if self.canvas_image is None: # self.canvas_image = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tkimage) # else: # self.canvas.itemconfig(self.canvas_image, image=self.tkimage) # print time.time() - t0 def _refresh_screen(self): self.image = adb.screenshot(scale=scale) self.tkimage = ImageTk.PhotoImage(self.image) w, h = self.image.size self.canvas.config(width=w, height=h) if self.canvas_image is None: self.canvas_image = self.canvas.create_image( 0, 0, anchor=tk.NW, image=self.tkimage) else: self.canvas.itemconfig(self.canvas_image, image=self.tkimage) self.root.after(10, self._refresh_screen) def run(self): self._refresh_screen() self.root.mainloop() s = Screen() adb.use_openstf(enabletouch=True) #, on_screenchange=s.refresh_screen) img = adb.screenshot() while img is None: time.sleep(1) img = adb.screenshot() s.run()
def screen_with_controls(scale=0.5): from PIL import Image, ImageTk import Tkinter as tk import tkFileDialog class Screen(object): def __init__(self): self.root = tk.Tk() self.root.title('Sync Screen') # self.image = Image.open(os.path.join(__dir__, 'static', 'screen.png')) self.image = None self.tkimage = None self.canvas_image = None self.make_toolbar() self.make_canvas() def make_toolbar(self): # tools: capture, power, home, menu, back, volume_up, volume_down, turn_screen, keymapping_settings toolbar = tk.Frame(self.root) self.icons = [] # need to keep a reference for tk images. wtf. def capture(): if self.image is None: print 'Not initialized, try later.' return d = tkFileDialog.asksaveasfilename(filetypes=(('Images', '*.png;*.jpg;'),), initialfile='screen.png') if not d: # canceled return if not d.endswith('.png') and not d.endswith('.jpg'): d += '.png' print 'Save to', d self.image.save(d) icon = ImageTk.PhotoImage(file=os.path.join(__dir__, 'static', 'icons', 'save.ico')) tk.Button(toolbar, image=icon, command=capture).pack(side=tk.LEFT, padx=2, pady=2) self.icons.append(icon) # def rotate(): # print 'rotate screen (Not Implemented yet.)' # icon = ImageTk.PhotoImage(file=os.path.join(__dir__, 'static', 'icons', 'rotate.ico')) # tk.Button(toolbar, image=icon, command=rotate).pack(side=tk.LEFT, padx=2, pady=2) # self.icons.append(icon) for key in ('power', 'home', 'menu', 'back', 'volume_up', 'volume_down'): icon = ImageTk.PhotoImage(file=os.path.join(__dir__, 'static', 'icons', '%s.ico' % key)) self.icons.append(icon) b = tk.Button(toolbar, image=icon, command=lambda k=key:adb.keyevent('KEYCODE_%s' % k.upper())) b.pack(side=tk.LEFT, padx=2, pady=2) toolbar.pack(side=tk.TOP, fill=tk.X) def make_canvas(self): # screen canvas, bind mouse input & keyboard input self.canvas = tk.Canvas(self.root, bg='black', bd=0, highlightthickness=0) self.canvas.pack() def _screen2touch(w, h, x, y): '''convert touch position''' ori = adb.orientation() if ori == 0: return x, y elif ori == 1: # landscape-right return w-y, x elif ori == 2: # upsidedown return w-x, h-y elif ori == 3: # landscape-left return h-x, y return x, y w, h = adb.display() screen2touch = partial(_screen2touch, w, h) def on_mouse_down(event): self.canvas.focus_set() x, y = int(event.x/scale), int(event.y/scale) x, y = screen2touch(x, y) adb._mini.touchqueue.put('d 0 %d %d 30\nc\n' % (x, y)) def on_mouse_up(event): adb._mini.touchqueue.put('u 0\nc\n') def on_mouse_drag(event): x, y = int(event.x/scale), int(event.y/scale) x, y = screen2touch(x, y) adb._mini.touchqueue.put('m 0 %d %d 30\nc\n' % (x, y)) self.canvas.bind('<ButtonPress-1>', on_mouse_down) self.canvas.bind('<ButtonRelease-1>', on_mouse_up) self.canvas.bind('<B1-Motion>', on_mouse_drag) keymap = {'\r':'KEYCODE_ENTER', ' ':'KEYCODE_SPACE', '\x08':'KEYCODE_DEL', } def on_key(event): c = event.char # print 'key pressed', repr(c), type(c) if c in 'adbcdefghijklmnopqrstuvwxyz0123456789': adb.input(c) return 'break' if c in keymap: adb.keyevent(keymap[c]) return 'break' self.canvas.bind('<Key>', on_key) # def refresh_screen(self, screen): # # refresh rate is about 0.03 second, cause flickering # if screen is None: # return # t0 = time.time() # h, w = screen.shape[:2] # w, h = int(w*scale), int(h*scale) # screen = cv2.resize(screen, (w, h)) # self.image = Image.fromarray(screen[:, :, ::-1]) # self.tkimage = ImageTk.PhotoImage(self.image) # # # thumbnail is slow... around 0.16 second # # w, h = self.image.size # # image = self.image.copy() # # image.thumbnail((w, h), Image.ANTIALIAS) # # self.tkimage = ImageTk.PhotoImage(image) # self.canvas.config(width=w, height=h) # if self.canvas_image is None: # self.canvas_image = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tkimage) # else: # self.canvas.itemconfig(self.canvas_image, image=self.tkimage) # print time.time() - t0 def _refresh_screen(self): self.image = adb.screenshot(scale=scale) self.tkimage = ImageTk.PhotoImage(self.image) w, h = self.image.size self.canvas.config(width=w, height=h) if self.canvas_image is None: self.canvas_image = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tkimage) else: self.canvas.itemconfig(self.canvas_image, image=self.tkimage) self.root.after(10, self._refresh_screen) def run(self): self._refresh_screen() self.root.mainloop() s = Screen() adb.use_openstf(enabletouch=True)#, on_screenchange=s.refresh_screen) img = adb.screenshot() while img is None: time.sleep(1) img = adb.screenshot() s.run()