使用libjpegturbo解压缩jpeg返回“空输入文件”

时间:2016-08-24 21:34:42

标签: c jpeg libjpeg libjpeg-turbo

正如标题所述,我正在尝试使用libjpeg-turbo读取JPEG文件。我在家里的Mac上尝试了这个代码并且它有效,但现在我在Windows上,并且在调用Empty input file时给出了jpeg_read_header错误。我已经通过执行fseek / ftell验证了文件不是空的,并且我得到的大小与我期望的相对应。

我最初的想法是我可能没有以二进制模式打开文件,所以我也尝试使用_setmode,但这似乎没有帮助。这是我的代码供参考。

int decodeJpegFile(char* filename)
{
    FILE *file = fopen(filename, "rb");

    if (file == NULL)
    {
        return NULL;
    }

    _setmode(_fileno(file), _O_BINARY);

    fseek(file, 0L, SEEK_END);
    int sz = ftell(file);
    fseek(file, 0L, SEEK_SET);


    struct jpeg_decompress_struct info; //for our jpeg info
    struct jpeg_error_mgr err; //the error handler

    info.err = jpeg_std_error(&err);
    jpeg_create_decompress(&info); //fills info structure
    jpeg_stdio_src(&info, file);
    jpeg_read_header(&info, true); // ****This is where it fails*****
    jpeg_start_decompress(&info);


    int w = info.output_width;
    int h = info.output_height;
    int numChannels = info.num_components; // 3 = RGB, 4 = RGBA
    unsigned long dataSize = w * h * numChannels;

    unsigned char *data = (unsigned char *)malloc(dataSize);
    unsigned char* rowptr;
    while (info.output_scanline < h)
    {
        rowptr = data + info.output_scanline * w * numChannels;
        jpeg_read_scanlines(&info, &rowptr, 1);
    }

    jpeg_finish_decompress(&info);
    fclose(file);

    FILE* outfile = fopen("outFile.raw", "wb");
    size_t data_out = fwrite(data, dataSize, sizeof(unsigned char), outfile);

}`

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

问题的核心是dll不匹配。 libjpeg重新构建msvcrt.dll,而应用程序是针对MSVS2015提供的任何运行时构建的。它们是不兼容的,并且在一个运行时中打开的文件指针对另一个运行时没有意义。

根据此discussion,解决方案是避免使用jpeg_stdio_src API。

答案 1 :(得分:0)

您正在将C ++ true值传递给jpeg_read_header - 这也可能是失败的原因。你应该传递TRUE常量。