68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
# Javier Escalada Gomez
|
|
#
|
|
# from:
|
|
# https://stackoverflow.com/questions/4524723/take-screenshot-in-python-on-mac-os-x
|
|
|
|
from pyscreenshot.plugins.backend import CBackend
|
|
from pyscreenshot.tempexport import read_func_img
|
|
|
|
|
|
class MacQuartzWrapper(CBackend):
|
|
name = "mac_quartz"
|
|
|
|
def grab(self, bbox=None):
|
|
im = read_func_img(self._grab_to_file, bbox)
|
|
return im
|
|
|
|
def _grab_to_file(self, filename, bbox=None, dpi=72):
|
|
# Should query dpi from somewhere, e.g for retina displays?
|
|
import LaunchServices # type: ignore
|
|
import Quartz # type: ignore
|
|
import Quartz.CoreGraphics as CG # type: ignore
|
|
from Cocoa import NSURL # type: ignore
|
|
|
|
if bbox:
|
|
width = bbox[2] - bbox[0]
|
|
height = bbox[3] - bbox[1]
|
|
region = CG.CGRectMake(bbox[0], bbox[1], width, height)
|
|
else:
|
|
region = CG.CGRectInfinite
|
|
|
|
# Create screenshot as CGImage
|
|
image = CG.CGWindowListCreateImage(
|
|
region,
|
|
CG.kCGWindowListOptionOnScreenOnly,
|
|
CG.kCGNullWindowID,
|
|
CG.kCGWindowImageDefault,
|
|
)
|
|
|
|
file_type = LaunchServices.kUTTypePNG
|
|
|
|
url = NSURL.fileURLWithPath_(filename)
|
|
|
|
dest = Quartz.CGImageDestinationCreateWithURL(
|
|
url,
|
|
file_type,
|
|
# 1 image in file
|
|
1,
|
|
None,
|
|
)
|
|
|
|
properties = {
|
|
Quartz.kCGImagePropertyDPIWidth: dpi,
|
|
Quartz.kCGImagePropertyDPIHeight: dpi,
|
|
}
|
|
|
|
# Add the image to the destination, characterizing the image with
|
|
# the properties dictionary.
|
|
Quartz.CGImageDestinationAddImage(dest, image, properties)
|
|
|
|
# When all the images (only 1 in this example) are added to the destination,
|
|
# finalize the CGImageDestination object.
|
|
Quartz.CGImageDestinationFinalize(dest)
|
|
|
|
def backend_version(self):
|
|
import objc # type: ignore
|
|
|
|
return objc.__version__
|