1+ import gc
12import os
23import time
34
@@ -21,6 +22,7 @@ class ImageView(Activity):
2122# Widgets
2223image = None
2324gif = None
25+ current_image_dsc = None # Track current image descriptor
2426
2527def onCreate (self ):
2628screen = lv .obj ()
@@ -208,6 +210,7 @@ def extract_dimensions_and_format(self, filename):
208210def show_image (self ,name ):
209211try :
210212self .label .set_text (name )
213+ self .clear_image ()
211214if name .lower ().endswith (".gif" ):
212215print ("switching to gif mode..." )
213216self .image .add_flag (lv .obj .FLAG .HIDDEN )
@@ -233,7 +236,7 @@ def show_image(self, name):
233236cf = lv .COLOR_FORMAT .RGB565
234237if color_format != "RGB565" :
235238print (f"WARNING: unknown color format{ color_format } , assuming RGB565..." )
236- image_dsc = lv .image_dsc_t ({
239+ self . current_image_dsc = lv .image_dsc_t ({
237240"header" : {
238241"magic" :lv .IMAGE_HEADER_MAGIC ,
239242"w" :width ,
@@ -244,7 +247,7 @@ def show_image(self, name):
244247'data_size' :len (image_data ),
245248'data' :image_data
246249 })
247- self .image .set_src (image_dsc )
250+ self .image .set_src (self . current_image_dsc )
248251self .scale_image ()
249252except OSError as e :
250253print (f"show_image got exception:{ e } " )
@@ -261,6 +264,8 @@ def scale_image(self):
261264self .image .decoder_get_info (self .image .get_src (),header )
262265image_w = header .w
263266image_h = header .h
267+ if image_w == 0 or image_h == 0 :
268+ return
264269print (f"the real image has size:{ header .w } x{ header .h } " )
265270scale_factor_w = round (lvgl_w * 256 / image_w )
266271scale_factor_h = round (lvgl_h * 256 / image_h )
@@ -270,3 +275,15 @@ def scale_image(self):
270275#self.image.set_scale(max(scale_factor_w,scale_factor_h)) # fills the entire screen but cuts off borders
271276self .image .set_scale (min (scale_factor_w ,scale_factor_h ))
272277print (f"after set_scale, the LVGL image has size:{ self .image .get_width ()} x{ self .image .get_height ()} " )
278+
279+
280+ def clear_image (self ):
281+ """Clear current image or GIF source to free memory."""
282+ if self .current_image_dsc :
283+ self .current_image_dsc = None # Release reference to descriptor
284+ self .image .set_src (None )# Clear image source
285+ self .gif .set_src (None )# Clear GIF source
286+ #self.gif.add_flag(lv.obj.FLAG.HIDDEN)
287+ #self.image.remove_flag(lv.obj.FLAG.HIDDEN)
288+ #lv.image_cache_invalidate_src(None) # Invalidate LVGL image cache
289+ gc .collect ()# Force garbage collection