图片资源

FAQ1 Solution中,可以使用哪些图片资源? 那些图片资源需要转换?

Solution 可以处理如下一些图片类资源。

文件类型

处理方式

png

该类型需要使用 eZIP 进行转换

png 序列帧

该类型需要使用 eZIP 进行转换。序列帧介绍参见序列帧打包

apng

该类型需要使用 eZIP 进行转换

gif

该类型需要使用 eZIP 进行转换

jpg

该类型采用软硬件结合的方式进行解码,需要先解码才能送去渲染

mp4

该类型目前采用软解(部分硬件)解码,推荐支持尺寸为240x240,需要使用ffmpeg进行转换(参数优化)

  • eZIP 工具存放在目录 \sdk\tools\png2ezip下面

  • eZIP 具体使用方法参见eZIP 命令


FAQ2 Solution中,图片资源存放位置是否需要遵循某些规则? 是否需要手动转换?

在 Solution 中,图片资源的存放位置有具体的规则要求,工具会根据存放的子目录自动进行相应的转换。

  • 在 Solution 中的存放位置具体参见图片资源及存放位置的介绍。注意: 必须严格遵循这个规则。

  • 编译时,Butterfli 工具会调用 eZIP 工具对资源目录对应分辨率进行相应的转换。

    • Nor方案和builtin_res的方案中,主代码中会转换为xxx.c,并生成对应的xxx_header.h参与编译

    • Nand的文件系统方案中,主代码中会转换为文件(png转换为bin,gif转换为agif,jpg和mp4直接原样copy)

    • 外置表盘及外置应用,由于运行在文件系统中,因此会统一转换为文件。


FAQ3 使用序列帧打包和采用N张png图片用LVGL实现有什么区别?

两种方式都能实现一样的效果,但序列帧打包具有以下优势:

  • eZIP 提供了序列帧打包功能,可以把 N 张相同 PNG 图片打包在一起,生成一个文件。通过调用专用的序列帧接口lv_img_set_src_seq就可以实现对某张 PNG 的播放,也可以调用控件lvsf_seq_frame(接口定义参见lvsf_seq_frame.h)来实现动画的播放。

  • 序列帧打包只生成一个文件,特别适用于外置表盘/外置应用以及 NAND 文件系统方案的场景。通过这种方式提高了存储利用率以及访问速度。


FAQ4 如何评估一个产品中图片资源大致占用的空间? 从而选定flash的大小?

  1. 首先在一个目录下存放所有的图片资源。 有两种存放方式:

    • 确定存放的父目录(如d:\images),然后再该目录下建立以下目录。并按照图片资源及存放位置严格分类存放各种资源。

      + common
        + ezip
        + no_ezip
        + gif
        + jpg
        + mp4
      
    • 所有的图片资源都放在一个目录(如d:\images)下。(该种方式存在的问题是,旋转图片是非压缩图片,但由于只有一个目录,eZIP将按照压缩处理。因此,会导致评估不准)

  2. 假定这个资源放在d:\images目录下,基于52x芯片,则评估命令为:

    • ezip -dir d:\images -binfile 2 -chip sf52x -outdir images_out

    • :eZIP 使用方法参见eZIP 命令

  3. 统计输出目录(如上面命令是images_out)下所有文件占用的size。

  4. 根据统计的size,预留一定的空间(如20%~30%)就可以确定图片资源占用的空间。


FAQ5 png的图片什么情况下需要选择带alpha的?什么情况下不需要带alpha的?

带 alpha 的 PNG 图片(也常称 PNG-32)是包含透明通道的格式,能实现图片背景 / 边缘的透明效果;不带 alpha 的 PNG 图片(也常称 PNG-24)无透明通道,仅保留 RGB 色彩信息。具体选择场景如下:

  1. 需要选择带 Alpha 通道的场景

  • 当图片需要与不同底色(如界面背景、渐变图层、动态背景)融合,或存在不规则 / 镂空 / 半透明效果时,必须使用带 Alpha 的 PNG:

  1. 不需要选择带 Alpha 通道的场景

  • 当图片为纯实色背景、无透明需求,或追求更小文件体积 / 更高加载效率时,使用不带 Alpha 的 PNG

  • 不需要带apha的图片(如背景)如果选择带了alpha,一方面会增加存储空间,另外一方面会降低渲染速度。

eZIP 处理 PNG 图片时,基本原则是:原图带 Alpha 将转换为带 Alpha 格式的 eZIP,原图不带 Alpha 将转换为不带 Alpha 格式的 eZIP。


FAQ6 为什么有些 GIF 图片用 eZIP 转换之后很大?

  • 问题:GIF 转换为 AGIF 之后,是直接送 ePIC 的硬件,不需要解码再送去渲染。因此对于 GIF 是一张大图,但只有局部动画的场景,可能生成出来的 AGIF 会特别大。

  • 解决方案:把这个 GIF 分为几个部分,一张静态底图,再加上一个或多个 GIF 动画。


FAQ7 为什么图片用 eZIP 转换之后和原图差不多,甚至比原图大很多?

  • eZIP 转换时,必须使用-binfile 2参数,不能用-cfile 2-cfile 1-binfile 1

  • 由于转换的原图是 PNG 格式,因此这个图已经是经过压缩的。一般来讲,eZIP 转换后的尺寸会比 PNG 稍小或差不多。


FAQ8 为什么有些jpg不能显示?

目前 Solution 方案中,支持 JPG 图片,具体如下:

  • 只支持基线 JPEG(Baseline JPEG),尚不支持渐进式 JPEG(Progressive JPEG)JPEG2000

  • 在 55x/56x/52x 芯片上,JPG 是软硬结合解码,相比于纯软解码效率要高很多,但不能与 eZIP(PNG)硬件解码速度相比,需要注意使用场景,否则会影响帧率。58x 以及后续芯片支持 JPG 硬件解码;

  • Solution 中显示 JPG 图片无论哪个平台都使用同一个接口(lv_img_set_src),中间层进行了适配。


因此,如果是从手机端推送,需要注意转换为Baseline的格式。


FAQ9 MP4(H.264)格式使用是否有限制?

  • MP4 在固件端显示需要经过 FFmpeg 的转换,具体转换方法参见JPG/H.264

  • 建议 MP4 的视频分辨率限制在 240x240。


FAQ10 PC 仿真(simulator)时图片是否使用的是eZIP压缩格式?

PC仿真时,使用的是像素格式。


FAQ11 eZIP在哪些操作系统平台上可以使用?

eZIP有以下一些版本,但Solution包里面默认只带了windows的版本。


FAQ12 怎么确认内存中的eZIP图片数据是否是正确的?

如果需要确认内存中的eZIP图片数据是否是正确:

  • 可以导出内存,然后参照eZIP压缩文件反解为png文件命令反解

  • 如果能够反解为png图片,点击后能够正常显示,则能够确认数据是正确的。

注意: 非压缩的图片不支持反解。


FAQ13 图片资源应该放到 ezipezip_dither 还是 no_ezip 目录?

可以按图片用途快速判断:

  1. 普通非旋转 PNG 图片放 ezip,编译时会转换为 eZIP 压缩资源;

  2. 非旋转但有渐变、且目标方案使用 RGB565 时,放 ezip_dither,用于降低渐变色分层;

  3. 需要旋转的图片放 no_ezip,会转换为像素格式,不做 eZIP 压缩;

  4. GIF、JPG、MP4、mask 图片分别放到 gifjpgmp4mask 目录。

图片目录规则和生成位置请参考 图片资源及存放位置生成图片存放的位置