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

如何从MySQL的BLOB列获取图片尺寸(无需落地磁盘)

从内存Blob直接获取图片尺寸的C++方案

你已经能把BLOB数据存成正常图片,说明内存里的字节流是完整的图片文件。要跳过存盘步骤拿尺寸,直接用支持内存读取的图片解析库就行,下面是两种实用实现:

轻量首选:stb_image(单头文件,无依赖)

stb_image是个极简的图片处理库,只用一个头文件就能搞定,专门适合这种内存解析场景,支持JPG/PNG/BMP等主流格式。

步骤:

  1. 把stb_image.h下载到项目里,在一个cpp文件里加:

    #define STB_IMAGE_IMPLEMENTATION
    #include "stb_image.h"
    

    (STB_IMAGE_IMPLEMENTATION只需要定义一次,用来生成库的实现代码)

  2. 解析char*类型的Blob数据:

    // 假设你已经拿到Blob数据和长度
    char* blob_data = ...;
    size_t blob_size = ...;
    
    int width, height, channels;
    // 只读取图片头信息,不加载像素数据,效率更高
    stbi_info_from_memory(reinterpret_cast<const stbi_uc*>(blob_data), blob_size, &width, &height, &channels);
    
    if (width > 0 && height > 0) {
        // 成功获取尺寸
        printf("图片宽高:%d × %d\n", width, height);
    } else {
        // 解析失败,可能是数据损坏或格式不支持
        printf("无法解析图片尺寸\n");
    }
    
  3. 解析字符缓冲区(比如std::vector或std::string):

    std::vector<char> img_buffer = ...; // 从BLOB读取的缓冲区
    
    int width, height, channels;
    stbi_info_from_memory(reinterpret_cast<const stbi_uc*>(img_buffer.data()), img_buffer.size(), &width, &height, &channels);
    
    if (width && height) {
        printf("图片宽高:%d × %d\n", width, height);
    }
    

备选:用OpenCV(如果项目已依赖)

如果你的项目本来就用OpenCV,直接用imdecode从内存加载Mat对象,再取尺寸:

std::vector<char> img_buffer = ...;
cv::Mat img = cv::imdecode(cv::Mat(img_buffer), cv::IMREAD_UNCHANGED);

if (!img.empty()) {
    printf("图片宽高:%d × %d\n", img.cols, img.rows);
}

不过OpenCV体积大,只是拿尺寸的话,stb_image更划算。

关键注意点

  • 确保内存里的Blob数据和存盘的内容完全一致,不能有截断或字节错误,否则解析会失败。
  • stbi_info会自动识别图片格式,不用你提前判断是JPG还是PNG。

内容的提问来源于stack exchange,提问作者BarzanHayati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:03:36