Python on Raspberry Pi to display images on ST7796S SPI LCD

Python exercises run on Raspberry Pi 4/64-bit Raspberry Pi OS (bookworm) to display images on Waveshare 3.5 inch 320x480 Capacitive Touch LCD, with ST7796S driver.


For connection and setup (include downloading of demo and drivers), refer to the post Test "Waveshare 3.5inch Capacitive Touch LCD" on Raspberry Pi Zero 2 W.

Exercise Code:

LCD_image_show.py, display single image.
Convert and rotate 1024x768 jpg image to 320x480, and display on ST7796 SPI LCD.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#import chardet

"""
Python exercise run on Raspberry Pi 4:
Read image and display on Waveshare 3.5inch Capacitive Touch LCD with ST7796 SPI driver.

Connection and setup, read:
https://coxxect.blogspot.com/2025/01/test-waveshare-35inch-capacitive-touch.html

remark:
All test images were generated by X's Grok, not real.
"""

import st7796
from PIL import Image, ImageOps

if __name__=='__main__':
    
    disp = st7796.st7796()
    print("st7796 LCD:", disp.width, "x", disp.height)
    disp.clear()

    # Read image from "images" sub-folder
    ImagePath = "./images/img_001.jpg"
    image = Image.open(ImagePath)
    print("Open image:", ImagePath)

    # Because the image source is 1024x768 landscape
    # and the LCD display is 320x480 portrait,
    # So have to:
    # resize from 1024x768 to 426x320
    # rotate from 426x320 to 320x426
    # expand to 320x480, with border of 27 pixel, (480-426)/2 = 27.
    # and it's found that the image is left-right reversed, so flip top-bottom on final image.
    print("image:", image.width, "x", image.height)
    img_resized = image.resize((426, 320), Image.LANCZOS)
    print("img_resized:", img_resized.width, "x", img_resized.height)
    img_rotated = img_resized.rotate(270, expand=True)
    print("img_rotated:", img_rotated.width, "x", img_rotated.height)
    img_expanded = ImageOps.expand(img_rotated, border=(0, 27), fill='black')
    print("img_expanded:", img_expanded.width, "x", img_expanded.height)
    img_transposed = img_expanded.transpose(Image.FLIP_TOP_BOTTOM)
    print("img_transposed:", img_transposed.width, "x", img_transposed.height)
    print("of type:", type(img_transposed))
    
    disp.show_image(img_transposed) #show on LCD
    
    

LCD_image_slideshow.py, display jpg images in "selected_images" sub-folder, in Slideshow.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#import chardet

"""
Python exercise run on Raspberry Pi 4:
Read images and display on Waveshare 3.5inch Capacitive Touch LCD with ST7796 SPI driver
in SlideShow.

Connection and setup, read:
https://coxxect.blogspot.com/2025/01/test-waveshare-35inch-capacitive-touch.html

remark:
All test images were generated by X's Grok, not real.
"""

import st7796
from PIL import Image, ImageOps

import os
import time

def showImage(image_source):
    image = Image.open(image_source)
    print("Open image:", image_source)
    img_resized = image.resize((426, 320), Image.LANCZOS)
    img_rotated = img_resized.rotate(270, expand=True)
    img_expanded = ImageOps.expand(img_rotated, border=(0, 27), fill='black')
    img_transposed = img_expanded.transpose(Image.FLIP_TOP_BOTTOM)

    disp.show_image(img_transposed) #show on LCD

if __name__=='__main__':
    
    
    disp = st7796.st7796()
    print("st7796 LCD:", disp.width, "x", disp.height)
    disp.clear()

    # Read jpg image from "selected_images" sub-folder
    images_folder = "./selected_images"
    files = os.listdir(images_folder)
    jpg_files = [file for file in files if file.endswith('.jpg')]
    sorted_jpg_files = sorted(jpg_files)

    while True:
        #display all .jpg images in folder    
        for filename in sorted_jpg_files:
            img_path = os.path.join(images_folder, filename)
            showImage(img_path)
            time.sleep(3)


LCD_blend.py, switch between two images by Image.blend().
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#import chardet

"""
Python exercise run on Raspberry Pi 4:
Read images and display images
on Waveshare 3.5inch Capacitive Touch LCD with ST7796 SPI driver,
merge two image with PIL.Image.blend().

Connection and setup, read:
https://coxxect.blogspot.com/2025/01/test-waveshare-35inch-capacitive-touch.html

remark:
All test images were generated by X's Grok, not real.
"""

import st7796
from PIL import Image, ImageOps

import os
import time

def getImage(image_source):
    image = Image.open(image_source)
    print("Open image:", image_source)
    img_resized = image.resize((426, 320), Image.LANCZOS)
    img_rotated = img_resized.rotate(270, expand=True)
    img_expanded = ImageOps.expand(img_rotated, border=(0, 27), fill='black')
    img_transposed = img_expanded.transpose(Image.FLIP_TOP_BOTTOM)
    
    return img_transposed

if __name__=='__main__':
    
    disp = st7796.st7796()
    print("st7796 LCD:", disp.width, "x", disp.height)
    disp.clear()
    
    # Read image from "images" sub-folder
    ImagePath_1 = "./images/img_001.jpg"
    ImagePath_2 = "./images/img_003.jpg"
    
    image_1 = getImage(ImagePath_1)
    image_2 = getImage(ImagePath_2)
    
    while True:
        for alpha in range(0, 101):
            blended_image = Image.blend(image_1, image_2, alpha/100)
            disp.show_image(blended_image) #show on LCD
        time.sleep(2)
        for alpha in range(100, -1, -1):
            blended_image = Image.blend(image_1, image_2, alpha/100)
            disp.show_image(blended_image) #show on LCD
        time.sleep(2)
    

LCD_blend_slideshow.py, switching through a list of images by blending.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#import chardet

"""
Python exercise run on Raspberry Pi 4:
Read images and display images
on Waveshare 3.5inch Capacitive Touch LCD with ST7796 SPI driver,
switching through a list of images with PIL.Image.blend().

Connection and setup, read:
https://coxxect.blogspot.com/2025/01/test-waveshare-35inch-capacitive-touch.html

remark:
All test images were generated by X's Grok, not real.
"""

import st7796
from PIL import Image, ImageOps

import os
import time

def getImage(image_source):
    image = Image.open(image_source)
    print("Open image:", image_source)
    img_resized = image.resize((426, 320), Image.LANCZOS)
    img_rotated = img_resized.rotate(270, expand=True)
    img_expanded = ImageOps.expand(img_rotated, border=(0, 27), fill='black')
    img_transposed = img_expanded.transpose(Image.FLIP_TOP_BOTTOM)
    
    return img_transposed

def switchImageByBlending(image_1, image_2):
    for alpha in range(0, 101):
        blended_image = Image.blend(image_1, image_2, alpha/100)
        disp.show_image(blended_image) #show on LCD
    time.sleep(1)

if __name__=='__main__':
    
    disp = st7796.st7796()
    print("st7796 LCD:", disp.width, "x", disp.height)
    disp.clear()
    
    # Read images from "images" sub-folder
    jpg_file_list = ["./images/img_001.jpg",
                     "./images/img_002.jpg",
                     "./images/img_003.jpg",
                     "./images/img_004.jpg",
                     "./images/img_005.jpg"]
    image_list = []
    
    for jpg_file in jpg_file_list:
        image_list.append(getImage(jpg_file))

    while True:
        for i in range(0, len(image_list)-1):
            switchImageByBlending(image_list[i], image_list[i+1])
        switchImageByBlending(image_list[len(image_list)-1], image_list[0])
        

LCD_rotate_image.py, rotate image.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#import chardet

"""
Python exercise run on Raspberry Pi 4:
Read image and display rotating image
on Waveshare 3.5inch Capacitive Touch LCD with ST7796 SPI driver.

Connection and setup, read:
https://coxxect.blogspot.com/2025/01/test-waveshare-35inch-capacitive-touch.html

remark:
All test images were generated by X's Grok, not real.
"""

import st7796
from PIL import Image, ImageOps

if __name__=='__main__':
    
    disp = st7796.st7796()
    print("st7796 LCD:", disp.width, "x", disp.height)
    disp.clear()

    # Read image from "images" sub-folder
    ImagePath = "./images/img_001.jpg"
    image = Image.open(ImagePath)
    print("Open image:", ImagePath)

    # Display rotated imag
    img_resized = image.resize((218, 160), Image.LANCZOS)
    img_transposed = img_resized.transpose(Image.FLIP_TOP_BOTTOM)
    
    #img_transposed used as source for other rotated image
    angle_step = 2
    for a in range(0, 360+angle_step, angle_step):
        img_rotated = img_transposed.rotate(a, expand=True)
        img_expanded = ImageOps.expand(img_rotated,
                                       border=(int((320-img_rotated.width)/2),
                                               int((480-img_rotated.height)/2)),
                                       fill='black')
        disp.show_image(img_expanded) #show on LCD
    
    print()


LCD_rotate_slideshow.py, rotate jpg images in "selected_images" sub-folder.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#import chardet

"""
Python exercise run on Raspberry Pi 4:
Read images and display rotating images
on Waveshare 3.5inch Capacitive Touch LCD with ST7796 SPI driver,
in SlideShow.

Connection and setup, read:
https://coxxect.blogspot.com/2025/01/test-waveshare-35inch-capacitive-touch.html

remark:
All test images were generated by X's Grok, not real.
"""

import st7796
from PIL import Image, ImageOps

import os
import time

def showRotatedImage(image_source):
    image = Image.open(image_source)
    print("Open image:", image_source)
    
    # Display rotated image
    img_resized = image.resize((218, 160), Image.LANCZOS)
    img_transposed = img_resized.transpose(Image.FLIP_TOP_BOTTOM)
    
    #img_transposed used as source for other rotated image
    angle_step = 5
    for a in range(0, 360, angle_step):
        img_rotated = img_transposed.rotate(a, expand=True)
        img_expanded = ImageOps.expand(img_rotated,
                                       border=(int((320-img_rotated.width)/2),
                                               int((480-img_rotated.height)/2)),
                                       fill='black')
        disp.show_image(img_expanded) #show on LCD

if __name__=='__main__':
    
    disp = st7796.st7796()
    print("st7796 LCD:", disp.width, "x", disp.height)
    disp.clear()

    # Read jpg image from "selected_images" sub-folder
    images_folder = "./selected_images"
    files = os.listdir(images_folder)
    jpg_files = [file for file in files if file.endswith('.jpg')]
    sorted_jpg_files = sorted(jpg_files)
    
    while True:
        for filename in sorted_jpg_files:
            img_path = os.path.join(images_folder, filename)
            showRotatedImage(img_path)



Comments

Popular posts from this blog

480x320 TFT/ILI9488 SPI wih EP32C3 (arduino-esp32) using Arduino_GFX Library

my dev.tools - FNIRSI 2C23T 3-in-1 Dual Channel Oscilloscope/Multimeter/Signal Generator