0

jpeg-turbo ライブラリの使い方を学ぼうとしています。そして、私は時間の悪魔を始めています。doc フォルダー内の example.c の例、および Web で見つけたすべての例は、.jpg ファイルを読み込もうとすると VS2013 でクラッシュします。それらは正常にコンパイルされます。しかし、それらを実行すると、アクセス違反エラーでクラッシュします。

私が本当に必要としているのは、VS2013 x64 で適切に動作することが知られている小さな (初心者に優しい) サンプルです。main(){} コード ブロック コードを含めます。また、VS プロジェクトのプロパティに特別な設定が必要な場合は、このクラッシュの原因となる可能性があります。

簡単な例を 1 つ機能させようとしているだけです。

助けてくれてありがとう。

*編集 - これは非常に小さな例です。また、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;
}
4

2 に答える 2

1

問題が見つかりました。

私のVSプロジェクトのLinker-> Input-> Additional Dependenciesで。Turbojpeg-static.lib を使用するように変更しました。または、非ターボ拡張ライブラリを使用している場合は jpeg-static.lib です。

画像の読み込み時に、turbojpeg.lib または jpeg.lib が何らかの理由でクラッシュします。

参考までに、VS2013 で libjpeg-turbo-1.4.2-vc64.exe バージョンを使用しています。そして、これが私がそれを機能させる方法です。

于 2016-01-04T17:33:35.313 に答える
1

私が学んだもう 1 つの非常に重要なことを共有したいと思います。新しい .jpg イメージに書き込む場合。新しい画像サイズが元の画像と異なる場合。通常はクラッシュします。特に、新しいサイズがソースよりも大きい場合。これは、カラー データを別のサイズに再サンプリングするのにはるかに長い時間がかかるために発生すると推測しています。したがって、このタイプのアクションでは、クラッシュを防ぐために独自のスレッドが必要になる場合があります。

これが原因で、コードエラーとコンパイラ設定を追跡するのに多くの時間を無駄にしました. だから、その人に気をつけてください。

于 2016-01-05T19:02:01.980 に答える