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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:48:31