0

我正在尝试学习如何使用 jpeg-turbo 库。我有一个魔鬼的时间开始。doc 文件夹中的 example.c 示例,以及我在网上找到的每个示例,当我尝试读取 .jpg 文件时在 VS2013 中崩溃。他们编译得很好。但是当我运行它们时,它们会因访问冲突错误而崩溃。

我真正需要的是一个可以在 VS2013 x64 中正常运行的小型工作(对初学者友好)示例。包括 main(){} 代码块代码。如果我可能需要设置的 VS 项目属性中有什么特别的东西可能会导致崩溃。

我正在努力让一个简单的例子工作。

谢谢您的帮助。

*编辑——这是一个非常小的例子。我也尝试让 jpeglib 在使用和不使用 Boost/GIL 的情况下运行,但加载图像时它总是崩溃:异常在 0x00000000774AE4B4 (ntdll.dll)

#include <stdio.h>
#include <assert.h>
#include <jpeglib.h>

#pragma warning(disable: 4996)

int main(int argc, char* argv[])
{
    struct jpeg_decompress_struct cinfo;
    struct jpeg_error_mgr jerr;
    JSAMPARRAY buffer;
    int row_stride;

    //initialize error handling
    cinfo.err = jpeg_std_error(&jerr);

    FILE* infile;
    infile = fopen("source.jpg", "rb");
    assert(infile != NULL);

    //initialize the decompression
    jpeg_create_decompress(&cinfo);

    //specify the input
    jpeg_stdio_src(&cinfo, infile);

    //read headers
    (void)jpeg_read_header(&cinfo, TRUE);

    jpeg_start_decompress(&cinfo); <----This guy seems to be the culprit

    printf("width: %d, height: %d\n", cinfo.output_width, cinfo.output_height);

    row_stride = cinfo.output_width * cinfo.output_components;

    buffer = (*cinfo.mem->alloc_sarray)
        ((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);

    JSAMPLE firstRed, firstGreen, firstBlue; // first pixel of each row, recycled
    while (cinfo.output_scanline < cinfo.output_height)
    {
        (void)jpeg_read_scanlines(&cinfo, buffer, 1);
        firstRed = buffer[0][0];
        firstBlue = buffer[0][1];
        firstGreen = buffer[0][2];
        printf("R: %d, G: %d, B: %d\n", firstRed, firstBlue, firstGreen);
    }

    jpeg_finish_decompress(&cinfo);

    return 0;
}
4

2 回答 2

1

我发现了问题。

在我的 VS 项目的 Linker->Input->Additional Dependencies 中。我将其更改为使用 turbojpeg-static.lib。或者 jpeg-static.lib 当我使用非 turbo 增强库时。

turbojpeg.lib 或 jpeg.lib 在读取图像时由于某种原因崩溃。

仅供参考,我正在使用带有 VS2013 的 libjpeg-turbo-1.4.2-vc64.exe 版本。这就是我让它工作的方式。

于 2016-01-04T17:33:35.313 回答
1

我想分享的另一件非常重要的事情。写入新的 .jpg 图像时。如果新图像大小与源图像不同。它通常会崩溃。特别是如果新大小大于源。我猜这是因为将颜色数据重新采样到不同大小需要更长的时间。所以这种类型的动作可能需要它自己的线程来防止崩溃。

由于这个原因,我浪费了很多时间来追踪代码错误和编译器设置。所以要小心那个。

于 2016-01-05T19:02:01.980 回答