JPG decoder¶
Allow the use of JPG images in LVGL. Besides that it also allows the use of a custom format, called Split JPG (SJPG), which can be decoded in more optimal way on embedded systems.
Overview¶
- Supports both normal JPG and the custom SJPG formats. 
- Decoding normal JPG consumes RAM with the size fo the whole uncompressed image (recommended only for devices with more RAM) 
- SJPG is a custom format based on "normal" JPG and specially made for LVGL. 
- SJPG is 'split-jpeg' which is a bundle of small jpeg fragments with an sjpg header. 
- SJPG size will be almost comparable to the jpg file or might be a slightly larger. 
- File read from file and c-array are implemented. 
- SJPEG frame fragment cache enables fast fetching of lines if available in cache. 
- By default the sjpg image cache will be image width * 2 * 16 bytes (can be modified) 
- Currently only 16 bit image format is supported (TODO) 
- Only the required partion of the JPG and SJPG images are decoded, therefore they can't be zoomed or rotated. 
Usage¶
If enabled in lv_conf.h by LV_USE_SJPG LVGL will register a new image decoder automatically so JPG and SJPG files can be directly used as image sources. For example:
lv_img_set_src(my_img, "S:path/to/picture.jpg");
Note that, a file system driver needs to registered to open images from files. Read more about it here or just enable one in lv_conf.h with LV_USE_FS_...
Converter¶
Converting JPG to C array¶
- Use lvgl online tool https://lvgl.io/tools/imageconverter 
- Color format = RAW, output format = C Array 
Converting JPG to SJPG¶
python3 and the PIL library required. (PIL can be installed with pip3 install pillow)
To create SJPG from JPG:
- Copy the image to convert into - lvgl/scripts
- cd lvgl/scripts
- python3 jpg_to_sjpg.py image_to_convert.jpg. It creates both a C files and an SJPG image.
The expected result is:
Conversion started...
Input:
        image_to_convert.jpg
        RES = 640 x 480
Output:
        Time taken = 1.66 sec
        bin size = 77.1 KB
        walpaper.sjpg           (bin file)
        walpaper.c              (c array)
All good!
Example¶
Load an SJPG image¶
C code
GitHub#include "../../lv_examples.h"
#if LV_USE_SJPG && LV_BUILD_EXAMPLES
/**
 * Load an SJPG image
 */
void lv_example_sjpg_1(void)
{
  lv_obj_t * wp;
  wp = lv_img_create(lv_scr_act());
  /* Assuming a File system is attached to letter 'A'
   * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */
  lv_img_set_src(wp, "A:lvgl/examples/libs/sjpg/small_image.sjpg");
}
#endif
#!/opt/bin/lv_micropython -i
import lvgl as lv
import display_driver
import fs_driver
fs_drv = lv.fs_drv_t()
fs_driver.fs_register(fs_drv, 'S')
wp = lv.img(lv.scr_act())
# The File system is attached to letter 'S'
wp.set_src("S:small_image.sjpg")
wp.center()