Error_016 2024-03-17 16:11 采纳率: 27.3%
浏览 3
已结题

libjpeg将图像压缩进内存后该如何保存

它压缩完就给我一个二维数组和图像大小,我把它写入后是0字节

        FILE* fp = fopen(filename.c_str(), "wb");
        if (fp == NULL) {
            return -1;
        }
        unsigned char** pdata = &imgdata;
        fwrite(pdata, 1, imgsize, fp);
        fclose(fp);

不要问我为什么有如此刁钻的要求,我只是想把它压缩后通过网络传输到客户端再保存

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-17 16:12
    关注

    引自免费微信小程序:皆我百晓生

    在C++中,您处理的是libjpeg压缩后的数据,通常这些数据是以JPEG格式编码的,并且并非简单的二维数组可以直接写入文件。要将压缩后的数据正确保存为JPEG文件,您应该调用libjpeg提供的相应函数接口。

    下面是一个基于libjpeg库(例如:jpeglib.h)的示例代码片段,展示如何将压缩后的数据写入文件:

    #include <stdio.h>
    #include "jpeglib.h"
    
    // 假设已经正确完成了压缩并得到了压缩数据及尺寸
    unsigned char** pdata; // 压缩后的数据二维数组
    int width, height; // 图像尺寸
    int row_stride; // 每一行字节数,通常等于width * 3(对于RGB)
    
    void write_jpeg_file(char* filename) {
        struct jpeg_compress_struct cinfo;
        struct jpeg_error_mgr jerr;
    
        FILE * outfile = fopen(filename, "wb");
    
        if (!outfile) {
            // 错误处理:无法打开文件
            return;
        }
    
        // 初始化JPEG压缩结构体
        cinfo.err = jpeg_std_error(&jerr);
        jpeg_create_compress(&cinfo);
    
        // 配置输出文件流
        jpeg_stdio_dest(&cinfo, outfile);
    
        // 设置图像参数
        cinfo.image_width = width;
        cinfo.image_height = height;
        cinfo.input_components = 3; // 对于RGB图像
        cinfo.in_color_space = JCS_RGB; // 根据实际情况调整颜色空间
    
        // 初始化压缩参数
        jpeg_set_defaults(&cinfo);
        // 可根据需求设置压缩质量等参数
        jpeg_set_quality(&cinfo, 90, TRUE); // 压缩质量设置为90
    
        // 开始压缩过程
        jpeg_start_compress(&cinfo, TRUE);
    
        JSAMPROW row_pointer[1]; // 指针数组用于存储每一行像素
    
        while (cinfo.next_scanline < cinfo.image_height) {
            row_pointer[0] = pdata[cinfo.next_scanline]; // 将当前行的数据指针赋值给row_pointer
            jpeg_write_scanlines(&cinfo, row_pointer, 1); // 写入一行数据
        }
    
        // 结束压缩并释放资源
        jpeg_finish_compress(&cinfo);
        jpeg_destroy_compress(&cinfo);
    
        fclose(outfile);
    }
    
    // 使用示例:
    write_jpeg_file(filename.c_str());
    

    请注意,上述代码假定您的二维数组pdata已经是按照libjpeg要求的格式组织的,即每行数据连续存放,且满足所需的颜色空间和像素格式。如果不满足这些条件,您可能需要进行相应的转换。此外,实际应用时,请确保已正确包含和链接了libjpeg库。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞
  • ¥15 请帮我看一下这个简易化学配平器的逻辑有什么问题吗?
  • ¥15 暴力法无法解出,可能要使用dp和数学知识