需要在VS2013 x64中运行的jpeglib-turbo示例

时间:2016-01-03 21:17:46

标签: c++ libjpeg-turbo

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

我真正需要的是一个很小的工作(初学者友好)示例,已知可以在VS2013 x64中正常运行。包括main(){}代码块代码。 如果VS项目属性中有任何特殊内容,我可能需要设置这可能导致此崩溃。

我正在试着让一个简单的例子正常工作。

感谢您的帮助。

*编辑 - 这是一个非常小的例子。 我也尝试过使用和不使用Boost / GIL来运行jpeglib 但它在加载图像时总是崩溃:异常在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;
}

2 个答案:

答案 0 :(得分:1)

我发现了问题。

在我的VS项目的Linker-&gt; Input-&gt;附加依赖项中。我把它改为使用turbojpeg-static.lib。或者当我使用非turbo增强库时jpeg-static.lib。

当读取图像时,turbojpeg.lib或jpeg.lib因某些原因崩溃。

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

答案 1 :(得分:1)

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

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