
ESP-IDF MIPI DSI LCD 测试图像生成指南用 FFmpeg 将 PNG 转换为 YUV422 与 Gray8 原始数据【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf导读在 ESP-IDF 的 MIPI DSI LCD 测试应用中驱动硬件需要的是裸像素数据raw data而不是经过压缩编码的 PNG/JPEG 文件。本指南以 components/esp_lcd/test_apps/mipi_dsi_lcd/resources/README.md 为核心讲解如何用 FFmpeg 一行命令把 PNG 图片转换为 YUV422yuyv422/yvyu422/uyvy422与 Gray8 灰度原始图像并结合仓库源码说明这些 raw 数据在 ESP32-P4 MIPI DSI 面板驱动中如何被嵌入固件、配置颜色转换并最终上屏。读完本文你将掌握测试图像生产、固件嵌入与 YUV/Gray 到 RGB888 硬件转换的完整链路。一、为什么测试应用需要 原始图像 而不是 PNGMIPI DSIDisplay Serial InterfaceD-PHY 总线上传输的是按像素排布的视频流数据LCD 控制器如 EK79007直接按行扫描消费这些像素。PNG 这类格式带有 zlib 压缩、调色板与文件头无法直接被esp_lcd_panel_draw_bitmap()逐像素消费。因此测试应用约定使用无压缩、无文件头的 raw 数据YUV422 打包格式每像素 16 bit两个像素共享一对 UV 色度分量Gray8 灰度格式每像素 8 bit单通道亮度值。在 resources/pictures 目录下仓库已经预先放置了转换产物hello.yuv、world.yuv、hello.gray、world.gray以及它们的 PNG 源图hello.png、world.png均为 320×320 分辨率。原 README 正是教开发者如何用 FFmpeg 复现这一转换流程。二、用 FFmpeg 从 PNG 生成 YUV422 原始图像原文档给出的核心命令如下ffmpeg -i hello.png -pix_fmt yuyv422 -f rawvideo hello.yuv命令拆解-i hello.png指定输入 PNG 源图-pix_fmt yuyv422指定输出像素格式为 YUV422 的 YUYV 字节序打包-f rawvideo强制输出为无封装、无压缩的裸视频流去掉 AVI/MOV 等容器头hello.yuv输出文件名内容为按像素扫描顺序排列的裸 YUV 数据。如果源图是world.png则把输入文件名换成world.png、输出为world.yuv即可。转换时应保证 PNG 的宽高与 LCD 分辨率测试用例中为 320×320一致否则draw_bitmap的坐标参数与数据长度会不匹配。支持的 YUV422 打包顺序原 README 明确列出本测试应用支持的三种 YUV422 打包顺序这也是esp_lcd颜色格式枚举覆盖的字节序NAMENB_COMPONENTSBITS_PER_PIXELBIT_DEPTHSyuyv4223168-8-8yvyu4223168-8-8uyvy4223168-8-8三者都是 3 分量、每像素 16 bit、Y/U/V 各 8 bit区别仅在于内存中的字节排列顺序YUYV、YVYU、UYVY。这一枚举在 components/esp_hal_lcd/include/hal/lcd_types.h 中有完整对应LCD_COLOR_FMT_YUV422_YUYV即yuyv422LCD_COLOR_FMT_YUV422_YVYU即yvyu422LCD_COLOR_FMT_YUV422_VYUYLCD_COLOR_FMT_YUV422_UYVY即uyvy422这些枚举值采用 FourCC 编码ESP_COLOR_FOURCC_YUYV等与 FFmpeg 的-pix_fmt命名天然对齐-pix_fmt yuyv422生成的字节流即可直接对应LCD_COLOR_FMT_YUV422_YUYV。三、用 FFmpeg 从 PNG 生成 Gray8 灰度原始图像对于不需要彩色的灰度显示场景原 README 给出的命令为ffmpeg -i hello.png -vf formatgray -pix_fmt gray -f rawvideo hello.gray命令拆解-i hello.png输入 PNG 源图-vf formatgray视频滤镜先把图像强制转换为灰度色彩空间将 RGB 亮度化-pix_fmt gray输出像素格式为 8-bit 灰度-f rawvideo与 YUV 场景相同输出裸数据hello.gray输出裸灰度数据文件。生成的数据对应lcd_color_format_t枚举中的LCD_COLOR_FMT_GRAY8见 lcd_types.h即每像素 8 bit 的灰度值。注意原 README 中-vf formatgray与-pix_fmt gray两者缺一不可前者保证 RGB 到灰度的色彩转换发生后者保证输出字节宽度为 8 bit。四、这些 raw 图像如何进入固件并上屏1. 通过 CMake 嵌入固件测试工程 components/esp_lcd/test_apps/mipi_dsi_lcd/CMakeLists.txt 使用target_add_binary_data把四个 raw 文件作为二进制段嵌入固件target_add_binary_data(mipi_dsi_lcd_panel_test.elf resources/pictures/hello.yuv BINARY) target_add_binary_data(mipi_dsi_lcd_panel_test.elf resources/pictures/world.yuv BINARY) target_add_binary_data(mipi_dsi_lcd_panel_test.elf resources/pictures/hello.gray BINARY) target_add_binary_data(mipi_dsi_lcd_panel_test.elf resources/pictures/world.gray BINARY)BINARY模式会生成_binary_文件名_start这类链接器符号代码中通过extern const uint8_t image_hello_yuv_start[] asm(_binary_hello_yuv_start)即可取得图像数据的起始地址见 test_mipi_dsi_panel.c。2. 配置 DPI 面板的颜色格式与转换在 test_mipi_dsi_panel.c 的 YUV 测试用例中DPI 面板配置了输入输出颜色格式并显式设置 YUV→RGB 转换参数// YUV422 - RGB888 .in_color_format LCD_COLOR_FMT_YUV422_YUYV, .out_color_format LCD_COLOR_FMT_RGB888,// Set color conversion configuration esp_lcd_color_conv_yuv_config_t convert_config { .in_color_range LCD_COLOR_RANGE_FULL, .out_color_range LCD_COLOR_RANGE_FULL, .conv_std LCD_YUV_CONV_STD_BT601, }; TEST_ESP_OK(esp_lcd_dpi_panel_set_yuv_conversion(mipi_dpi_panel, convert_config));Gray8 测试用例该用例在 ESP32-P4 rev v3 之外均可用代码见 test_mipi_dsi_panel.c则把in_color_format设为LCD_COLOR_FMT_GRAY8同样输出LCD_COLOR_FMT_RGB888。3. 上屏绘制配置完成后用标准的esp_lcd_panel_draw_bitmap()把裸数据按整帧推送给面板即可for (int i 0; i 4; i) { TEST_ESP_OK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, 320, 320, image_hello_yuv_start)); vTaskDelay(pdMS_TO_TICKS(1000)); TEST_ESP_OK(esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, 320, 320, image_world_yuv_start)); vTaskDelay(pdMS_TO_TICKS(1000)); }这段逻辑对应 test_mipi_dsi_panel.c。这里 320×320 正是hello.png/world.png的尺寸见 resources/pictures 下的 PNG 源图再次印证了PNG 源图尺寸必须与 LCD 分辨率一致这一前提。五、底层原理颜色转换配置的结构与取值esp_lcd_dpi_panel_set_yuv_conversion()的声明位于 components/esp_lcd/dsi/include/esp_lcd_mipi_dsi.h其参数类型esp_lcd_color_conv_yuv_config_t定义在 components/esp_lcd/include/esp_lcd_types.h包含三个字段字段类型含义in_color_rangelcd_color_range_t输入颜色YUV的色域范围out_color_rangelcd_color_range_t输出颜色RGB的色域范围conv_stdlcd_yuv_conv_std_t采用的 YUV↔RGB 转换标准各枚举取值定义在 components/esp_hal_lcd/include/hal/lcd_types.h色域lcd_color_range_tLCD_COLOR_RANGE_LIMIT有限/视频范围YCbCr 通常为 16~235与LCD_COLOR_RANGE_FULL全范围 0~255。测试用例选择 FULL即输入输出都按 0~255 全范围解释不做色域裁剪。转换标准lcd_yuv_conv_std_tLCD_YUV_CONV_STD_BT601标清电视标准RGB 全范围与LCD_YUV_CONV_STD_BT709高清电视标准。测试用例选择 BT.601这也是 FFmpeg 在未显式指定色彩矩阵时多数编码场景的默认换算基准与上文的-pix_fmt yuyv422产物配合最直接。提示若在esp_lcd的 RGB LCD 路径下使用同类转换可参考另一个测试工程 components/esp_lcd/test_apps/rgb_lcd/main/test_yuv_rgb_conv.c其中同样使用LCD_YUV_CONV_STD_BT601配置验证了该转换接口在不同面板类型间的一致性。六、完整工作流小结准备 PNG 源图宽高与 LCD 分辨率一致用 FFmpeg 生成 raw 数据彩色ffmpeg -i hello.png -pix_fmt yuyv422 -f rawvideo hello.yuv或yvyu422/uyvy422灰度ffmpeg -i hello.png -vf formatgray -pix_fmt gray -f rawvideo hello.gray通过target_add_binary_data()将 raw 文件嵌入固件参照 CMakeLists.txt在 DPI 面板配置中声明in_color_format/out_color_format并调用esp_lcd_dpi_panel_set_yuv_conversion()设置色域与转换标准参照 test_mipi_dsi_panel.c用esp_lcd_panel_draw_bitmap()按帧推送裸数据完成上屏。这套流程适用于 ESP32-P4 上以 EK79007 为代表的 MIPI DSI 接口 LCD测试应用的目标芯片与面板配置见 mipi_dsi_lcd 测试应用 README开发者可以据此替换为自己的图片素材生成符合 YUV422/Gray8 规范的测试图像。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考