Lecture d'image PBM sous MicroPython

Bonjour à tous,

Non non, ce n'est pas une faute de frappe, nous parlons bien du format PBM.

J'ai profité d'un moment de libre pour développer un BpmReader, une classe capable de lire des fichiers images aux format Portable Bit Map binaires sous MicroPython.


https://github.com/mchobby/esp8266-upy/tree/master/FILEFORMAT

Très facile à produire avec un outils comme GIMP, le format bpm est beaucoup plus compacte que le format Bitamp RGB888.
Le format PBM encode chaque pixel sur un bit là où le format BMP RGB888 nécessite 24 bits par pixel (outch!). PBM est donc un format noir et blanc... limité mais convient à tous les afficheurs LCD et OLED :-)

Produire un fichier PBM

Par exemple, il est possible de transformer ce logo MicroPython...

En image au format PBM (128 pixels de large), cela produit
 

Conversion vers Pbm
Re-converti en JPEG pour pouvoir publier l'exemple

Qui ne fait que 2130 octets :-)

Pour produire un fichier PBM est super simple:

  1. Charger un fichier dans "The Gimp"
  2. Redimensionnez le
  3. Savez le en utilisant le meni "Fichier | Exporter comme..."
  4. Nommer le fichier avec l'extension "pbm".
  5. Confirmer l'enregistrement au format binaire/brute.


Pas besoin de manipuler les couleurs avec Gimp, le filtre d'exportation fait un excellent travail de tramage. 

Du code pour le peuple

Le PbmReader s'accompagne de fonctions & classes utilitaires dans img.py.  Ces fonctions permettent de faciliter l'ouverture open_image() , la lecture et le décodage des pixels de l'image.

Le principe d'un Reader, c'est qu'il ne charge pas les données en mémoire mais permet d'accéder aux différents pixels via des accès fichiers. Cela réduit l'empreinte mémoire mais est aussi plus lents (puisque cela implique plus d'appels systèmes.

Dès les débuts de cette bibliothèques, la fonction open_image() retournait un un object ClipReader. Le ClipReader manipule un Reader pour sélectionner une zone d'extraction dans l'image cible. Cela permet de concentrer plusieurs ressources dans un seul fichier (ou d'opérer une opération de défilement/slide).

from machine import SPI, Pin
from lcd12864 import SPI_LCD12864
from img import open_image
import time

# PYBStick: S19=mosi, S23=sck, S26=/ss
cs = Pin( 'S26', Pin.OUT, value=0 )
spi = SPI( 1 )
spi.init( polarity=0, phase=1 )

lcd = SPI_LCD12864( spi=spi, cs=cs )

def color_transform( rgb ):
	# Transformer la couleur (r,g,b) en valeur 2 couleurs (1/0)
	return 0 if rgb==(0,0,0) else 1

reader = open_image( 'mpy.pbm' )
# Garder la partie de l'image à la taille de l'écran
reader.clip(0,0,lcd.width,lcd.height) 
# Copier le contenu dans le FramBuffer du LCD
reader.copy_to(lcd, 0,0, color_transform )
lcd.update() # Afficher sur le LCD

Cool comme code, non?

MCHobby investi du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Ressource

Envie d'en savoir plus sur ces fonctions utilitaires?

Snap!

Aucun commentaire