ESP32Cam OV2640拍摄保存的JPG图片在Windows无法打开如何解决
ESP32-Cam 生成损坏JPG文件解决方案
核心根因
你当前写入SD卡的153600字节是QVGA分辨率下RGB565格式的原始图像帧大小,说明frame2jpg接口未正确执行转换,实际写入的是原始像素数据而非JPG编码内容,因此手动补全文件头也无法正常打开。可按以下步骤调整:
1. 校验frame2jpg转换状态
必须验证转换函数的返回值和输出参数,不能默认转换成功:
- 入参需传入正确的帧缓冲指针、质量参数(建议范围10-63,数值越小质量越高),同时传入
jpg_buf和jpg_len的指针接收转换后的数据地址和长度 - 仅当函数返回
true时,转换结果才有效
示例代码:
camera_fb_t *fb = esp_camera_fb_get(); uint8_t *jpg_buf = NULL; size_t jpg_len = 0; bool convert_success = frame2jpg(fb, 30, &jpg_buf, &jpg_len); if(!convert_success){ esp_camera_fb_return(fb); return; // 转换失败直接退出,不要执行后续写入逻辑 }
2. 修正SD卡写入的数据源和长度
不要使用原始帧缓冲的buf和len写入文件,必须使用转换后输出的JPG相关参数:
- 写入数据源为
jpg_buf,写入长度为转换返回的jpg_len,不要硬编码写入长度 - 写入完成后先关闭文件,再手动释放
jpg_buf内存,最后归还帧缓冲
示例代码:
// 必须用二进制模式wb打开文件,不要用文本模式w,避免二进制内容被自动转义损坏 FILE *fp = fopen("/sdcard/capture.jpg", "wb"); if(fp != NULL){ fwrite(jpg_buf, 1, jpg_len, fp); fclose(fp); } // 按顺序释放内存 free(jpg_buf); esp_camera_fb_return(fb);
3. 可选优化:开启OV2640硬件JPG编码
OV2640本身支持硬件输出JPG格式,无需软件转换,可直接在摄像头初始化时配置像素格式为PIXFORMAT_JPEG,此时esp_camera_fb_get获取的帧缓冲本身就是标准JPG数据,直接写入SD卡即可,转换效率更高且不会出现软件转换异常。
初始化配置片段:
camera_config_t cam_cfg = { .pixel_format = PIXFORMAT_JPEG, // 配置为JPEG输出,替代RGB565/GRAYSCALE .frame_size = FRAMESIZE_QVGA, // 按需选择分辨率 .jpeg_quality = 30, // JPG质量参数,范围10-63 .fb_count = 1 };
4. 排查SD卡写入异常
确认SD卡挂载状态正常,排除SPI通信异常导致的写入数据错位问题。
内容的提问来源于stack exchange,提问作者dowonderatwill
相关产品推荐
相关产品推荐

