0

このコードを実行して jpeg ファイルをロードすると、jpeg_read_scanlines でクラッシュが発生します VC++ 2010 で Windows 7 64 ビットを使用しています

読み込んでいる画像は 100x75 jpg 画像です。

さらに詳細が必要な場合は、お尋ねください

クラッシュ メッセージは次のとおりです。

void JPG_Load (const char *path, image_t *img) 
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
int infile;
JSAMPARRAY buffer;  
int row_stride;     
unsigned char *out;

infile = fopen(path,"rb");
if (infile == 0) {
    memset (img, 0, sizeof(image_t));
    return;
}

cinfo.err = jpeg_std_error(&jerr);

jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, (FILE *)infile);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
row_stride = cinfo.output_width * cinfo.output_components;
out = malloc(cinfo.output_width*cinfo.output_height*cinfo.output_components);

img->pixels = out;
img->width = cinfo.output_width;
img->height = cinfo.output_height;
img->bytesPerPixel = cinfo.out_color_components;

while (cinfo.output_scanline < cinfo.output_height) {
    buffer = (JSAMPARRAY)out+(row_stride*cinfo.output_scanline);
    jpeg_read_scanlines(&cinfo, buffer, 1);
}

jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);

fclose(infile);
}

image_t は次のように定義されます。

typedef struct {
int width;
int height;
int bytesPerPixel;
byte *pixels;
} image_t;
4

1 に答える 1

3

これをしないでください。

buffer = (JSAMPARRAY)out+(row_stride*cinfo.output_scanline); // WRONG

JSAMPARRAY基本的にはにキャストしていvoid **ます。それはあなたが持っている種類のデータではないので、結果はゴミです:あなたはバイトの配列を持っています。

jpeg_read_scanlinesドキュメントを見ると、この関数はバッファへのポインタを取りません。スキャンラインの配列へのポインターを取り、各スキ​​ャンラインは行データへのポインターです。

while (cinfo.output_scanline < cinfo.output_height) {
    unsigned char *rowp[1];
    rowp[0] = (unsigned char *) out + row_stride * cinfo.output_scanline;
    jpeg_read_scanlines(&cinfo, rowp, 1);
}

推奨事項:コンパイラエラーを修正するためのキャストの追加は、キャストが正しいことがわかっている場合にのみ機能します。タイプが何であるかを知らない限り、どのタイプにもキャストしないでください。

于 2012-07-31T02:49:40.843 に答える