如何从MySQL的BLOB列获取图片尺寸(无需落地磁盘)
从内存Blob直接获取图片尺寸的C++方案
你已经能把BLOB数据存成正常图片,说明内存里的字节流是完整的图片文件。要跳过存盘步骤拿尺寸,直接用支持内存读取的图片解析库就行,下面是两种实用实现:
轻量首选:stb_image(单头文件,无依赖)
stb_image是个极简的图片处理库,只用一个头文件就能搞定,专门适合这种内存解析场景,支持JPG/PNG/BMP等主流格式。
步骤:
把
stb_image.h下载到项目里,在一个cpp文件里加:#define STB_IMAGE_IMPLEMENTATION #include "stb_image.h"(
STB_IMAGE_IMPLEMENTATION只需要定义一次,用来生成库的实现代码)解析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"); }解析字符缓冲区(比如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
相关产品推荐
相关产品推荐

