def screen_record_v3(): last_time = time.time() while 1: region = CG.CGRectMake(100, 100, 400, 400) image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) prov = CG.CGImageGetDataProvider(image) data = CG.CGDataProviderCopyData(prov) byteperrow = CG.CGImageGetBytesPerRow(image) #print prov #<CGDataProvider 0x7fc19b1022f0> #print type(data) #<objective-c class __NSCFData at 0x7fff78073cf8> img = np.frombuffer(data, dtype=np.uint8) img = img.reshape((height, byteperrow//4,4)) img = img[:, :width, :] print('loop took {0} seconds' . format(time.time()-last_time)) img = process_img(img) # the above take roughly 0.01s last_time = time.time() cv2.imshow('window',img) if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break
def capture(self) -> np.array: """ Capture border-less window content and return it as a raw pixel array """ screenBounds = CG.CGRectNull listOption = CG.kCGWindowListOptionIncludingWindow windowID = self.window['kCGWindowNumber'] imageOption = CG.kCGWindowImageBoundsIgnoreFraming | CG.kCGWindowImageShouldBeOpaque screenshot = CG.CGWindowListCreateImage(screenBounds, listOption, windowID, imageOption) width, height = CG.CGImageGetWidth(screenshot), CG.CGImageGetHeight( screenshot) bytesPerRow = CG.CGImageGetBytesPerRow(screenshot) if width <= 1 and height <= 1: warnings.warn( "Can't capture window because the process is minimized", RuntimeWarning) return None dataProvider = CG.CGImageGetDataProvider(screenshot) rawPixels = CG.CGDataProviderCopyData(dataProvider) image = np.frombuffer(rawPixels, dtype=np.uint8).reshape( [height, bytesPerRow // 4, 4]) return image[self.TitleBarHeight:height, 0:width, 0:3]
def capture(self): # Region size is hard coded, please change it # as per your need. X = 50 Y = 160 region = CG.CGRectMake(X, Y, 160, 116) if region is None: region = CG.CGRectInfinite else: # Capture region should be even sized else # you will see wrongly strided images i.e corrupted if region.size.width % 2 > 0: emsg = "Capture region width should be even (was %s)" % ( region.size.width) raise ValueError(emsg) # Create screenshot as CGImage image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) # Intermediate step, get pixel data as CGDataProvider prov = CG.CGImageGetDataProvider(image) # Copy data out of CGDataProvider, becomes string of bytes self._data = CG.CGDataProviderCopyData(prov) # Get width/height of image self.width = CG.CGImageGetWidth(image) self.height = CG.CGImageGetHeight(image)
def take_screenshot(self, x, y, w, h, hwnd=None): """ get area screenshot Args: x, y: top-left corner of a rectangle w, h: rectangle dimensions hwnd: for compatibility Returns: numpy array http://stackoverflow.com/questions/37359192/cannot-figure-out-numpy-equivalent-for-cv-mat-step0 """ [x, y, w, h] = map(int, [x, y, w, h]) driver_cache_size = 64 # bytes # align width to the nearest value that divisible by driver_cache_size if w % driver_cache_size != 0: w = driver_cache_size * (int(w / driver_cache_size) + 1) image_ref = CG.CGWindowListCreateImage( CG.CGRectMake(x, y, w, h), # CG.CGRectInfinite, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) pixeldata = CG.CGDataProviderCopyData( CG.CGImageGetDataProvider(image_ref)) height = CG.CGImageGetHeight(image_ref) width = CG.CGImageGetWidth(image_ref) image = Image.frombuffer("RGBA", (width, height), pixeldata, "raw", "RGBA", 0, 1).convert('RGB') return np.array(image)
def cgimage_screen_capture(self, region=None): """ inputs region: Quartz.CoreGraphics CGRect """ if region is None: region = CG.CGRectInfinite elif region.size.width % 2 > 0: raise ValueError( "Capture region width: %s should be even to avoid warp" % region.size.width) image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) image_get_data_provider = CG.CGImageGetDataProvider(image) self.screen_capture_byte_data = CG.CGDataProviderCopyData( image_get_data_provider) # Get width/height of image self.screen_capture_width = CG.CGImageGetWidth(image) self.screen_capture_height = CG.CGImageGetHeight(image)
def scoreGrab(dy): """Captures an image of the scoreboard and converts it to RGB array. Returns scoreboard readings from ScoreReading.py scoreBoard() method.""" region = CG.CGRectMake(434, 142 + dy, 190, 88) image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) bytesperrow = CG.CGImageGetBytesPerRow(image) pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(image)) array = np.frombuffer(pixeldata, dtype=np.uint8) array = array.reshape((height, bytesperrow // 4, 4)) array = array[:, :, [2, 1, 0]][:, :width, :] r, g, b = array.T grey = (r == 196) & (g == 196) & (b == 196) array[:, :, :3][grey.T] = (0, 0, 0) other = (r > 0) & (g >= 0) & (b > 0) array[:, :, :3][other.T] = (255, 255, 255) return array, sr.scoreBoard(array)
def capture(self, region=None): """region should be a CGRect, something like: >>> import Quartz.CoreGraphics as cg >>> region = cg.CGRectMake(0, 0, 100, 100) >>> sp = _MacAdapter() >>> sp.capture(region=region) The default region is CG.CGRectInfinite (captures the full screen) """ if region is None: region = cg.CGRectInfinite else: if not isinstance(region, (list, tuple)): raise AttributeError("Capture region must be a list or tuple") if region[0] % 2 > 0: raise ValueError( "Capture region width should be even (was %s)" % region[0]) region = cg.CGRectMake(0, 0, region[0], region[1]) image = cg.CGWindowListCreateImage(region, cg.kCGWindowListOptionOnScreenOnly, cg.kCGNullWindowID, cg.kCGWindowImageDefault) width = cg.CGImageGetWidth(image) height = cg.CGImageGetHeight(image) provider = cg.CGImageGetDataProvider(image) data = cg.CGDataProviderCopyData(provider) return data, width, height
def grab_desktop(self, return_type=0): """ grab desktop screenshot. :type return_type: int :param return_type: 0 for pil image, 1 for color matrix, 2 for gray matrix :rtype: numpy.ndarray or Image.Image :return: the screenshot image """ ret_image = None # Create screenshot as CGImage image = CG.CGWindowListCreateImage(CG.CGRectInfinite, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) # Allocate enough space to hold our pixels imageData = objc.allocateBuffer(int(4 * width * height)) # Create the bitmap context bitmapContext = CG.CGBitmapContextCreate( imageData, # image data we just allocated... width, # width height, # height 8, # 8 bits per component 4 * width, # bytes per pixel times number of pixels wide CG.CGImageGetColorSpace( image), # use the same colorspace as the original image CG.kCGImageAlphaPremultipliedLast) # use premultiplied alpha CG.CGContextDrawImage(bitmapContext, CG.CGRectMake(0, 0, width, height), image) #Now your rawData contains the image data in the RGBA8888 pixel format. #del bitmapContext ret_image = Image.frombuffer("RGBA", (width, height), imageData, "raw", "RGBA", 0, 1) #return ret_image #ret_image.save('out.jpg') ret_image = ret_image.convert('RGB') #ret_image.save('out.jpg') if return_type == self.get_color_mat: return self._get_cv_color_mat(ret_image) if return_type == self.get_gray_mat: mat = self._get_cv_color_mat(ret_image) return self._get_cv_gray_mat(mat) else: return ret_image
def capture(): global screenshot_width global screenshot_data region = CG.CGRectInfinite # Create screenshot as CGImage image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) prov = CG.CGImageGetDataProvider(image) screenshot_data = CG.CGDataProviderCopyData(prov) screenshot_width = CG.CGImageGetWidth(image)
def get_img(x, y, w, h): region = CG.CGRectMake(x, y, w, h) image = CG.CGWindowListCreateImage(region, 1, 0, 0) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) bytesperrow = CG.CGImageGetBytesPerRow(image) pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(image)) image = np.frombuffer(pixeldata, dtype=np.uint8) image = image.reshape((height, bytesperrow // 4, 4)) im = image[:, :width, :] return im
def screen_record(): region = CG.CGRectMake(100, 122, 400, 378) #image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageNominalResolution) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) prov = CG.CGImageGetDataProvider(image) data = CG.CGDataProviderCopyData(prov) byteperrow = CG.CGImageGetBytesPerRow(image) img = np.frombuffer(data, dtype=np.uint8) img = img.reshape((height, byteperrow//4,4)) img = img[:, :width, :] return img
def pixel(self, x, y): region = CG.CGRectMake(x, y, 1, 1) image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) prov = CG.CGImageGetDataProvider(image) self._data = CG.CGDataProviderCopyData(prov) self.width = CG.CGImageGetWidth(image) self.height = CG.CGImageGetHeight(image) data_format = "BBBB" b, g, r, a = struct.unpack_from(data_format, self._data, offset=0) return (r, g, b)
def screen_record(self): image = CG.CGWindowListCreateImage(self.region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) prov = CG.CGImageGetDataProvider(image) data = CG.CGDataProviderCopyData(prov) byteperrow = CG.CGImageGetBytesPerRow(image) img = np.frombuffer(data, dtype=np.uint8) img = img.reshape((height, byteperrow // 4, 4)) img = img[:, :width, :] return img
def takeScreenshot(self): image = CG.CGWindowListCreateImage(CG.CGRectInfinite, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) prov = CG.CGImageGetDataProvider(image) _data = CG.CGDataProviderCopyData(prov) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) imgdata = np.frombuffer(_data, dtype=np.uint8).reshape(int(len(_data) / 4.0), 4) numpy_img = imgdata[:width * height, :-1].reshape(height, width, 3) return numpy_img
def observationGrab(): """Captures image of the game screen and converts it to RGB array.""" region = CG.CGRectMake(401, 130, 634, 445) image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) bytesperrow = CG.CGImageGetBytesPerRow(image) pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(image)) array = np.frombuffer(pixeldata, dtype=np.uint8) array = array.reshape((height, bytesperrow // 4, 4)) array = array[:, :, [2, 1, 0]][:, :width, :] return array
def screenshot(x, y, w, h): region = CG.CGRectMake(x, y, w, h) # Create screenshot as CGImage image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) bytesperrow = CG.CGImageGetBytesPerRow(image) pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(image)) image = np.frombuffer(pixeldata, dtype=np.uint8) image = image.reshape((height, bytesperrow // 4, 4)) return image[:, :width, :]
def get_image(self, x, y, width, height, logger=None): #region = CG.CGRectMake(0, 0, 100, 100) region = CG.CGRectInfinite image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) bpc = CG.CGImageGetBitsPerComponent(image) bpp = CG.CGImageGetBitsPerPixel(image) rowstride = CG.CGImageGetBytesPerRow(image) alpha = CG.CGImageGetAlphaInfo(image) alpha_str = ALPHA.get(alpha, alpha) if logger: logger("OSXRootWindowModel.get_image(..) image size: %sx%s, bpc=%s, bpp=%s, rowstride=%s, alpha=%s", width, height, bpc, bpp, rowstride, alpha_str) prov = CG.CGImageGetDataProvider(image) argb = CG.CGDataProviderCopyData(prov) return ImageWrapper(0, 0, width, height, argb, "BGRX", 24, rowstride)
def capture_window(window_info): image = CG.CGWindowListCreateImage( CG.CGRectNull, CG.CG.kCGWindowListOptionIncludingWindow, window_info['kCGWindowNumber'], CG.kCGWindowImageBoundsIgnoreFraming | CG.kCGWindowImageBestResolution) # CG.kCGWindowImageBoundsIgnoreFraming | CG.kCGWindowImageNominalResolution) width = CG.CGImageGetWidth(image) height = CG.CGImageGetHeight(image) bytesperrow = CG.CGImageGetBytesPerRow(image) pixeldata = CG.CGDataProviderCopyData(CG.CGImageGetDataProvider(image)) image = np.frombuffer(pixeldata, dtype=np.uint8) image = image.reshape((height, bytesperrow // 4, 4)) image = image[:, :width, :] return image
def capture(self, region=None): """capture screenshot from region :region: tuple of (x, y, width, height) """ if region is None: region = CG.CGRectInfinite # full screen # Create screenshot as CGImage image = CG.CGWindowListCreateImage(region, CG.kCGWindowListOptionOnScreenOnly, CG.kCGNullWindowID, CG.kCGWindowImageDefault) # Copy data out of CGDataProvider, becomes string of bytes self._data = CG.CGDataProviderCopyData( CG.CGImageGetDataProvider(image)) # Get width/height of image self.width = CG.CGImageGetWidth(image) self.height = CG.CGImageGetHeight(image)
#!/usr/bin/python # Gets partial screenshot and saves it into PNG file. import Quartz.CoreGraphics as cg region = cg.CGRectMake( 0, 0, 400, 400) # You can also use cg.CGRectInfinite for the full screen. image = cg.CGWindowListCreateImage(region, cg.kCGWindowListOptionOnScreenOnly, cg.kCGNullWindowID, cg.kCGWindowImageDefault) prov = cg.CGImageGetDataProvider(image) img_data = cg.CGDataProviderCopyData(prov) img_width, img_height = cg.CGImageGetWidth(image), cg.CGImageGetHeight(image) from pngcanvas import PNGCanvas import struct canvas = PNGCanvas(img_width, img_height) for x in range(img_width): for y in range(img_height): # Calculate offset, based on http://www.markj.net/iphone-uiimage-pixel-color/ offset = 4 * ((img_width * int(round(y))) + int(round(x))) # Pixel data is unsigned char (8bit unsigned integer), and there are for (blue,green,red,alpha). # Unpack data from string into Python'y integers. b, g, r, a = struct.unpack_from("BBBB", img_data, offset=offset) # Assign BGRA color as RGBA. canvas.point(x, y, color=(r, g, b, a)) with open("test.png", "wb") as f: f.write(canvas.dump())