Une mise à jour majeure du module Python MSS vient de sortir. L'API et l'organisation du code ont été grandement modifiés. Cette version n'est donc pas rétro-compatible avec le code écrit pour la version 1.x.y, bien que les corrections soient rapides et faciles.

MSS est donc un module Python qui permet de prendre des captures d'écran en utilisant seulement le module ctypes. Optimisé pour chaque plate-forme, il est ultra rapide et ne consomme quasiment aucune ressource. Il s'agit d'un module destiné à être intégré à d'autres logiciels, notamment dans le domaine du jeu-vidéo.

Pour mettre à jour ou installer le module via pypi :

pip install --upgrade mss

Le bilan, après plus d'un an de développement, est on ne peut plus positif ! Le module fonctionne parfaitement sur tous les systèmes, et ce sans dépendre d'autre modules ; tous les bugs ont été corrigés et la vitesse d'exécution époustouflante. Bref, le module est stable et le code me paraît plutôt pas mal (☺). Si vous vous en servez, faîtes-moi signe.






Général

Développeur

  • Séparation du code dans plusieurs fichiers. Chaque implémentation de la classe MSS se trouve dans un fichier au nom du système -- soit ce que platform.system() renvoie.

Contenu du module :

mss/__init__.py   # informations relatives au module
mss/exception.py  # exception ScreenshotError
mss/fabric.py     # fabrique contenant la méthode mss()
mss/base.py       # implémentation de la classe parente MSSBase

mss/darwin.py     # implémentation de la classe MSS pour MacOS X
mss/linux.py      # implémentation de la classe MSS pour GNU/Linux
mss/windows.py    # implémentation de la classe MSS pour Windows

mss/linux/*       # code de la bibliothèque partagée MSS


L'import du module peut se faire à l'aide de la fabrique (factory) : from mss import mss ou de manière ciblée telle que :
# MacOS X
from mss.darwin import MSS

# GNU/Linux
from mss.linux import MSS

# Microsoft Windows
from mss.windows import MSS


L'appel de la classe, ou méthode, peut se faire de deux façons différentes aussi.
À l'ancienne : screenshotter = mss() ou à l'aide du mot clef with :
with mss() as screenshotter:
    # ...


  • La méthode save_img() est renommée en to_png().
  • Dans la méthode to_png(), l'argument screen est remplacé par mon (pour monitor, ou moniteur).
  • Dans la méthode to_png(), les arguments width et height ont été supprimés.
  • Des optimisations certaines à tous les niveaux.

Nouveautés

  • Fonctionne parfaitement de Python 2.6 à Python 3.5, conforme à la PEP8 et passe les tests de Pylint, Coala et Flake8.
  • Une documentation complète de l'API (voir README.rst).
  • Les contributeurs aussi ne sont pas délaissés, le fichier CONTRIBUTORS tente de les remercier du mieux possible.
  • Des modèles de rapport de bug et de proposition de patch.

Bug résolu

  • #7 : les fichiers PNG générés sont incorrects (patch).

En effet, les anciens fichiers s'affichaient bien dans n'importe quelle visionneuse d'image, mais certains outils renvoyaient l'avertissement « libpng warning: Ignoring bad adaptive filter type ». Pour comprendre, il faut savoir comment est encodée une image PNG. Pour faire simple, il s'agit d'une liste : type de filtre + pixels de toute la ligne de l'image. Le seul type de filtre existant est 0, soit :

0 + pixels ligne 1
0 + pixels ligne 2
0 + pixels ligne N
0 + pixels dernière ligne

Le message d'avertissement nous fait comprendre que le type de filtre est inconnu. L'utilisation de struct.pack('>B', 0) à la place d'un bête b'0' fut suffisant pour corriger le problème.
>>> struct.pack('>B', 0)
'\x00'
>>> b'0'
'0'



MacOS X

Correction

  • get_pixels() retourne bien les pixels de l'image et non un objet spécifique à OS X.

Bug résolu

  • #8 : modification majeure du code pour utiliser uniquement le module ctypes, comme c'est le cas des implémentations des autres systèmes. Ce qui veut dire que les modules PyObjc, Quartz et LaunchServices ne sont plus nécessaires.
Graphique 1
Test de vélocité. Graphique par ChartGo

GNU/Linux

Corrections

  • Prévention d'une segfault lorsqu'il n'y a aucun serveur X demarré (patch).
  • Prévention d'une segfault lorsque l'extension Xrandr n'est pas chargée (patch).

Nouveauté

Graphique 2
Test de vélocité. Graphique par ChartGo

Windows

Nouveauté

  • Fonctionne parfaitement de Windows XP à Windows 10 (non testé sur les versions antérieures à XP).

Bug résolu

  • #6 : les captures d'écrans ne sont pas correctes sur certaines configurations du système.

Le correctif, bien qu'il m'ait pris plus d'un an à le trouver, fut simple : il suffisait de spécifier certaines propriétés de l'en-tête du BitMap. En effet, en mettant à 0 les attributs biClrUsed et biClrImportant, cela permet de dire au système que nous voulons accéder directement aux pixels, sans passer par une table des couleurs.
Le code qui gère le BitMap est très intéressant, il y a quelques astuces qui valent leur pesant d'or.

Graphique 3
Test de vélocité. Graphique par ChartGo