如何基于jpeglib修改代码读取未解压的file.jpg原始压缩缓冲区?
直接读取JPEG原始字节(不解压)的解决方案
嘿,我懂你的需求——你不需要用libjpeg的解压逻辑来获取JPEG的原始数据,因为那些jpeg_decompress_struct之类的结构体是专门用来解码图像像素的,完全不是用来读取原始文件字节的。其实用标准的C文件操作就能轻松实现你的需求,绕开所有解压步骤。
核心思路
直接把file.jpg当作普通二进制文件处理,读取它的全部原始字节到缓冲区,不需要涉及任何JPEG解码逻辑。
完整示例代码
#include <stdio.h> #include <stdlib.h> int main() { const char* filename = "file.jpg"; FILE* infile = NULL; unsigned char* buffer = NULL; long file_size = 0; // 1. 以二进制模式打开文件(必须用"rb",避免Windows下的换行符转译) infile = fopen(filename, "rb"); if (!infile) { fprintf(stderr, "无法打开文件: %s\n", filename); return 1; } // 2. 获取文件大小 fseek(infile, 0, SEEK_END); file_size = ftell(infile); fseek(infile, 0, SEEK_SET); // 回到文件开头 // 3. 分配足够的缓冲区内存 buffer = (unsigned char*)malloc(file_size * sizeof(unsigned char)); if (!buffer) { fprintf(stderr, "内存分配失败\n"); fclose(infile); return 1; } // 4. 读取全部原始字节到缓冲区 size_t bytes_read = fread(buffer, 1, file_size, infile); if (bytes_read != file_size) { fprintf(stderr, "读取文件不完整,预期读取%ld字节,实际读取%zu字节\n", file_size, bytes_read); free(buffer); fclose(infile); return 1; } // --- 这里可以把buffer里的原始字节原样发送 --- // 比如用send()或者其他传输函数,直接用buffer和file_size参数 // 5. 清理资源 free(buffer); fclose(infile); return 0; }
为什么你原来的libjpeg代码不适用?
你之前找到的代码是用来解码JPEG为像素数据的:
jpeg_decompress_struct会解析JPEG的文件头,然后解压出YUV或者RGB像素数据JSAMPARRAY buffer存储的是解码后的像素行,完全不是原始的JPEG字节流- 整个流程会丢弃原始的压缩数据,只保留解压后的像素信息
注意事项
- 必须用二进制模式打开文件(
"rb"):在Windows系统中,文本模式("r")会自动把\n转译为\r\n,破坏JPEG的二进制结构 - 一定要检查每个操作的返回值:文件打开失败、内存分配失败、读取不完整都是常见问题,必须处理这些错误避免程序崩溃
- 使用完缓冲区后记得
free(),关闭文件避免资源泄漏
内容的提问来源于stack exchange,提问作者Hamid Bazargani
相关产品推荐
相关产品推荐

