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.
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
Post a Comment