2016-08-24 26 views
1

正如標題所述,我試圖使用libjpeg-turbo讀取JPEG文件。我在家裏的Mac上試過這個代碼,它工作,但現在我在Windows上,它給我jpeg_read_headerEmpty input file錯誤。我已經通過執行fseek/ftell來驗證該文件不是空的,並且我得到的大小對應於我期望的大小。使用libjpegturbo解壓縮jpeg返回「空輸入文件」

我最初的想法是,我可能沒有以二進制模式打開文件,所以我嘗試使用_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); 

}` 

任何幫助非常感謝!

+0

你真的應該使用你的調試器來看看發生了什麼,而不是猜測可能是什麼問題。 – PaulMcKenzie

+0

你說得對。我目前沒有libjpeg的源代碼/符號,因此我無法在此處進行挖掘。我希望有人已經遇到過這個問題,因爲我想要做的事情是非常基本的。最壞的情況下,我必須自己下載/構建libjpeg – Sid

+0

如何在Windows上構建應用程序? – user58697

回答

2

該問題的核心是DLL不匹配。該libjpeg再次構建msvcrt.dll,而該應用程序是針對MSVS2015提供的任何運行時構建的。它們不兼容,並且在一個運行時中打開的文件指針對另一個無效。

根據此discussion,解決方案是要避免jpeg_stdio_src API。

+0

順便說一句,在它的頁面上有Visualj ++的libjpeg-turbo的官方版本,例如:https://sourceforge.net/projects/libjpeg-turbo/files/1.5.0/ - 我使用它多年以及'jpeg_stdio_src' API –

+0

@AntonMalyshev我使用的是與VS2015相同的Visual C++二進制文件,我仍然看到崩潰。實際上,在他們的網站上也記載了,除非您針對msvcrt.dll構建應用程序,否則傳遞C運行時句柄將在Windows上失敗。 [鏈接](http://www.libjpeg-turbo.org/Documentation/OfficialBinaries) – Sid

+0

不知道爲什麼,但我沒有VS2008的問題,也許幸運:) –

0

您正在將C++ true的值傳遞給jpeg_read_header - 這也可能是失敗的原因。您應該傳遞TRUE常數。

+0

是的,從技術上講,這是真的,但你有這個編譯器會抱怨(相當大聲)如果'true'未被聲明。 –

+0

問題不在於聲明/未聲明。 true和TRUE,甚至C++ true和C99 true都可以具有不同的內部表示(不同的int值),從而導致奇怪的運行時錯誤。我幾次遇到這個問題。 –

+0

我明白了你的觀點,基本上'true'是*實現定義的*,所以由OP來驗證它是否通過了他認爲它是'require image'標誌的地方。 –