Error_016 2024-03-23 12:53 采纳率: 27.3%
浏览 5

使用jpeglib-turbo压缩时遇到错误

我尝试使用jpeglib-turbo压缩rgb数据


void jpeg_compress(const char* jpegFileName, unsigned char* inputData,
    int nWidth, int nHeight, int nChannel, int nQuality)
{
    /* This struct contains the JPEG compression parameters and pointers to
    * working space (which is allocated as needed by the JPEG library).
    * It is possible to have several such structures, representing multiple
    * compression/decompression processes, in existence at once.  We refer
    * to any one struct (and its associated working data) as a "JPEG object".
    */
    struct jpeg_compress_struct cinfo;

    /* This struct represents a JPEG error handler.  It is declared separately
    * because applications often want to supply a specialized error handler
    * (see the second half of this file for an example).  But here we just
    * take the easy way out and use the standard error handler, which will
    * print a message on stderr and call exit() if compression fails.
    * Note that this struct must live as long as the main JPEG parameter
    * struct, to avoid dangling-pointer problems.
    */
    struct jpeg_error_mgr jerr;

    /* More stuff */
    FILE* outfile;                  /* target file */
    JSAMPROW row_pointer[1];        /* pointer to JSAMPLE row[s] */
    int     row_stride;             /* physical row width in image buffer */

    /* Step 1: allocate and initialize JPEG compression object */

    /* We have to set up the error handler first, in case the initialization
    * step fails.  (Unlikely, but it could happen if you are out of memory.)
    * This routine fills in the contents of struct jerr, and returns jerr's
    * address which we place into the link field in cinfo.
    */
    cinfo.err = jpeg_std_error(&jerr);

    /* Now we can initialize the JPEG compression object. */
    jpeg_create_compress(&cinfo);  /* Now we can initialize the JPEG compression object. */

    /* Step 2: specify data destination (eg, a file) */
    /* Note: steps 2 and 3 can be done in either order. */

    /* Here we use the library-supplied code to send compressed data to a
    * stdio stream.  You can also write your own code to do something else.
    * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
    * requires it in order to write binary files.
    */
    if ((outfile = fopen(jpegFileName, "wb")) == NULL)
    {
        fprintf(stderr, "can't open %s\n", jpegFileName);
        return;
    }
    jpeg_stdio_dest(&cinfo, outfile);

    /* Step 3: set parameters for compression */

    /* First we supply a description of the input image.
    * Four fields of the cinfo struct must be filled in:
    */
    cinfo.image_width = nWidth;                /* image width and height, in pixels */
    cinfo.image_height = nHeight;
    cinfo.input_components = nChannel;         /* # of color components per pixel */

    if (nChannel == 1)
    {
        cinfo.in_color_space = JCS_GRAYSCALE;  /* colorspace of input image */
    }
    else if (nChannel == 3)
    {
        cinfo.in_color_space = JCS_RGB;        /* colorspace of input image */
    }
    else if (nChannel == 4) {
        cinfo.in_color_space = JCS_EXT_RGBA;
    }

    /* Now use the library's routine to set default compression parameters.
    * (You must set at least cinfo.in_color_space before calling this,
    * since the defaults depend on the source color space.)
    */
    jpeg_set_defaults(&cinfo);

    // Now you can set any non-default parameters you wish to.
    // Here we just illustrate the use of quality (quantization table) scaling:
    jpeg_set_quality(&cinfo, nQuality, TRUE); /* limit to baseline-JPEG values */

    /* Step 4: Start compressor */

    /* TRUE ensures that we will write a complete interchange-JPEG file.
    * Pass TRUE unless you are very sure of what you're doing.
    */
    jpeg_start_compress(&cinfo, TRUE);

    /* Step 5: while (scan lines remain to be written) */
    /*           jpeg_write_scanlines(...); */

    /* Here we use the library's state variable cinfo.next_scanline as the
    * loop counter, so that we don't have to keep track ourselves.
    * To keep things simple, we pass one scanline per call; you can pass
    * more if you wish, though.
    */
    row_stride = nWidth * nChannel; /* JSAMPLEs per row in image_buffer */

    while (cinfo.next_scanline < cinfo.image_height)
    {
        /* jpeg_write_scanlines expects an array of pointers to scanlines.
        * Here the array is only one element long, but you could pass
        * more than one scanline at a time if that's more convenient.
        */
        row_pointer[0] = &inputData[cinfo.next_scanline * row_stride];
        (void)jpeg_write_scanlines(&cinfo, row_pointer, 1);
    }

    /* Step 6: Finish compression */
    jpeg_finish_compress(&cinfo);
    jpeg_destroy_compress(&cinfo);

    /* After finish_compress, we can close the output file. */
    fclose(outfile);
}

使用DXGI截图来获取RGBA数据

void SaveDesktopImage(ID3D11Texture2D* texture2D, DXGIDuplicator* duplicator, const char* filename,int quality)
{
    D3D11_TEXTURE2D_DESC desc;
    texture2D->GetDesc(&desc);
    D3D11_MAPPED_SUBRESOURCE mappedResource;
    duplicator->deviceContext_->Map(texture2D, 0, D3D11_MAP_READ, 0, &mappedResource);

    //swap_red_blue_channels((unsigned char*)mappedResource.pData, desc.Width, desc.Height);
    //size_t imageSize = desc.Width * desc.Height * 4;
    jpeg_compress(filename,(uint8_t*)mappedResource.pData, desc.Width, desc.Height, 4, quality);
}

结果报错了:

img


0x00007FFD6C911208 (ucrtbase.dll) (HostA.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-23 12:53
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:这段代码的作用是什么?它使用了哪个库?它实现了什么功能? 回答: 这段代码的作用是使用jpeglib-turbo库来压缩RGB数据,并将其写入JPEG文件中。它使用了jpeglib-turbo库。 它实现了以下功能:
    1. 分配和初始化 JPEG 压缩对象。
    2. 指定数据目标(例如文件)。
    3. 设置压缩参数,例如图像大小、色彩空间和压缩质量。
    4. 使用jpeglib-turbo库压缩RGB数据并将压缩后的数据写入JPEG文件。 这是一个在C语言中使用jpeglib-turbo库压缩RGB数据并写入JPEG文件的示例代码。它可以用于将图像转换为JPEG格式以节省存储空间和加快加载速度。
    评论

报告相同问题?

问题事件

  • 创建了问题 3月23日

悬赏问题

  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵