You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:36:03