Page 1 sur 1

Afficher une image/logo sur écran OLED

Publié : mer. 5 mai 2021 10:04
par Dominique
L'idéal est d'utiliser un format peu gourmand et sous forme de fichier binaire.
PBM :Portable BitMap est idéal et supporté par Gimp. Il suffit de charger une image, changer la taille et exporter en pbm. Gimp fait un dégradé de gris puis applique un algorithme de distribution des points pour simuler les dégradés. Top!

J'ai une bibliothèque PBM pour MicroPython ici qui réduit au maximum l'utilisation de la RAM. Basé uniquement sur du file reading et une mémoire tampon.

La bibliothèque imglib/bpm.py et la fonction img.py - open_image() permettent d'ouvrir facilement l'image et d'en copier le contenu vers un FrameBuffer (celui de l'écran OLED)... ou tout ce qui expose une interface compatible FrameBuffer.
Il est même possible d'inspecter une partie de l'image dans la console en mode texte (c'est pas mal pour faire du debug).

Code : Tout sélectionner

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 du clipreader (rgb) vers la couleur du FrameBuffer de
	# destination (l'afficheur LCD -> 2 coleurs)
	return 0 if rgb==(0,0,0) else 1

reader = open_image( 'mpy.pbm' )
# Selection la partie de l'image (à la taille du LCD)
reader.clip(0,0,lcd.width,lcd.height)
# Copier la section Clipée dans le FrameBuffer du LCD à partir de sa coordonnée
# 0,0 et pour la taille du clipping (largeur,hauteur)
reader.copy_to(lcd, 0,0, color_transform )
lcd.update()
Sélection_062.png
A noter la présence de reader.clip() qui permet de sélectionner une partie de l'image.
Il est donc possible d'avoir un fichier de ressource unique avec plusieurs images dedans.... ou de faire du scrolling sur une image en déplacant la zone de clipping.

La bibliothèque support également les images BMP 24 bits en RGB888... si cela peut intéresser.