Source code for pi3d.util.Screenshot

from __future__ import absolute_import, division, print_function, unicode_literals

import ctypes
import numpy as np

from pi3d.constants import (opengles, GLint, GLsizei, GLubyte, GL_DEPTH_COMPONENT, 
                            GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, PIL_OK)
 

from pi3d.util import Log

if PIL_OK:
  from PIL import Image

[docs]def screenshot(filestring=None): """ Save whatever's in the display to a file. Will save whatever has been rendered since the last call to Display.clear(). The file will be saved in the same directory as the app if you don't add a path to it! If PIL is not available then the screenshot will be saved as a compressed numpy array and '.npz' will be appended to the filestring you supply. The image can be extracted from the npz file using: img = np.load('filestring.npz')['arr_0'] If this function is called without any argument then it will not save to file and will return a numpy array of the screen. The array and file, if saved, will have the alpha values removed. """ from pi3d.Display import Display w, h = Display.INSTANCE.width, Display.INSTANCE.height img = masked_screenshot(0, 0, w, h) if filestring is None: return img if PIL_OK: im = Image.frombuffer('RGB', (w, h), img, 'raw', 'RGB', 0, 1) im.save(filestring, quality=90) else: np.savez_compressed('{}'.format(filestring), img)
[docs]def masked_screenshot(x, y, w, h): """returns numpy array from part of screen so it can be used by applications drawing low resolution offscreen textures using scaling. """ img = np.zeros((h, w, 4), dtype=np.uint8) opengles.glReadPixels(GLint(x), GLint(y), GLsizei(w), GLsizei(h), GL_RGBA, GL_UNSIGNED_BYTE, img.ctypes.data_as(ctypes.POINTER(GLubyte))) return img[::-1,:,:3].copy()