PNG decoder(PNG解码器)

查看原文

Allow the use of PNG images in LVGL. This implementation uses lodepng library.

If enabled in lv_conf.h by LV_USE_PNG LVGL will register a new image decoder automatically so PNG files can be directly used as any other image sources.

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_...

The whole PNG image is decoded so during decoding RAM equals to image width x image height x 4 bytes are required.

As it might take significant time to decode PNG images LVGL's images caching feature can be useful.

PNG解码器让我们可以在 LVGL 中使用 PNG 图像。这个实现中使用到了 lodepng 库。

如果在 lv_conf.h 中启用了 LV_USE_PNG ,LVGL 在初始化时会自动注册 PNG 图像解码器,之后 PNG 文件可以直接用作图像源使用。

请注意,需要注册文件系统驱动程序才能从文件中打开图像。在此处阅读有关它的更多信息,或者仅在 lv_conf.h 中使用 LV_USE_FS_ 启用一个...

请注意,需要注册文件系统驱动程序才能从文件中打开图像。点击这里阅读关于文件系统的更多信息,或直接在 lv_conf.h 中打开其中一个类似 LV_USE_FS_... 的宏。

PNG解码器会对整个PNG图像解码,所以在解码过程中需要RAM为: 图像宽度 x 图像高度 x 4字节

由于解码 PNG 图像可能需要大量时间,这时候 LVGL 的图像缓存功能就能派上用场了( lv_conf.h 中的 LV_IMG_CACHE_DEF_SIZE)。


拓展阅读

Example

Open a PNG image from file and variable

C code  

 GitHub
#include "../../lv_examples.h"
#if LV_USE_PNG && LV_USE_IMG && LV_BUILD_EXAMPLES

/**
 * Open a PNG image from a file and a variable
 */
void lv_example_png_1(void)
{
    LV_IMG_DECLARE(img_wink_png);
    lv_obj_t * img;

    img = lv_img_create(lv_scr_act());
    lv_img_set_src(img, &img_wink_png);
    lv_obj_align(img, LV_ALIGN_LEFT_MID, 20, 0);

    img = 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(img, "A:lvgl/examples/libs/png/wink.png");
    lv_obj_align(img, LV_ALIGN_RIGHT_MID, -20, 0);
}

#endif

MicroPython code  

 GitHub Simulator
#!/opt/bin/lv_micropython -i
import lvgl as lv
import display_driver
from imagetools import get_png_info, open_png
from img_wink_png import img_wink_png_map
# Register PNG image decoder
decoder = lv.img.decoder_create()
decoder.info_cb = get_png_info
decoder.open_cb = open_png

img_wink_png = lv.img_dsc_t(
    {
        "header": {"always_zero": 0, "w": 50, "h": 50,  "cf": lv.img.CF.RAW_ALPHA},
        "data_size": 5158,
        "data": img_wink_png_map,
    }
)
img1 = lv.img(lv.scr_act())
img1.set_src(img_wink_png)
img1.align(lv.ALIGN.RIGHT_MID, -250, 0)

# Create an image from the png file
try:
    with open('wink.png','rb') as f:
        png_data = f.read()
except:
    print("Could not find wink.png")
    sys.exit()

wink_argb = lv.img_dsc_t({
  'data_size': len(png_data),
  'data': png_data 
})

img2 = lv.img(lv.scr_act())
img2.set_src(wink_argb)
img2.align(lv.ALIGN.RIGHT_MID, -150, 0)

API

Functions

void lv_png_init(void)

Register the PNG decoder functions in LVGL