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 :
$ python -m 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 queplatform.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 ento_png()
. - Dans la méthode
to_png()
, l'argumentscreen
est remplacé parmon
(pourmon
itor, oumon
iteur). - Dans la méthode
to_png()
, les argumentswidth
etheight
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
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.
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é
-
get_pixels()
ultra rapide grâce à la bibliothèque partagée MSS (code C).
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.