Skip to content

Commit b80e090

Browse files
ImageView: Try free'ing up memory
1 parent 46526c6 commit b80e090

File tree

1 file changed

+19
-2
lines changed
  • internal_filesystem/apps/com.micropythonos.imageview/assets

1 file changed

+19
-2
lines changed

internal_filesystem/apps/com.micropythonos.imageview/assets/imageview.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import gc
12
import os
23
import 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

Comments
 (0)