1+ import gc
12import os
23import time
34
@@ -21,6 +22,7 @@ class ImageView(Activity):
2122 # Widgets
2223 image = None
2324 gif = None
25+ current_image_dsc = None # Track current image descriptor
2426
2527 def onCreate (self ):
2628 screen = lv .obj ()
@@ -208,6 +210,7 @@ def extract_dimensions_and_format(self, filename):
208210 def show_image (self , name ):
209211 try :
210212 self .label .set_text (name )
213+ self .clear_image ()
211214 if name .lower ().endswith (".gif" ):
212215 print ("switching to gif mode..." )
213216 self .image .add_flag (lv .obj .FLAG .HIDDEN )
@@ -233,7 +236,7 @@ def show_image(self, name):
233236 cf = lv .COLOR_FORMAT .RGB565
234237 if color_format != "RGB565" :
235238 print (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 )
248251 self .scale_image ()
249252 except OSError as e :
250253 print (f"show_image got exception: { e } " )
@@ -261,6 +264,8 @@ def scale_image(self):
261264 self .image .decoder_get_info (self .image .get_src (), header )
262265 image_w = header .w
263266 image_h = header .h
267+ if image_w == 0 or image_h == 0 :
268+ return
264269 print (f"the real image has size: { header .w } x{ header .h } " )
265270 scale_factor_w = round (lvgl_w * 256 / image_w )
266271 scale_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
271276 self .image .set_scale (min (scale_factor_w ,scale_factor_h ))
272277 print (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
0 commit comments