ページ 11

libjpegでエラー

Posted: 2011年12月17日(土) 19:14
by みけCAT
Windows Vista Home Premium SP2 32ビット、Dev-C++4.9.9.2です。
libjpegは
http://sourceforge.net/projects/libjpeg/files/
のjpegsr6.zipを解凍したものをMSYSでコンパイルしたものを使っています。
MSYSはgcc version3.2.3です。
画像を暗号化するソフトにlibjpegを使ってjpegを読み込む機能をつけようと思ったのですが、
jpeg_create_decompress( &cinfo );でエラーを吐きます。
コードはこれです。

コード:

#include "imageaes.h"
#define XMD_H
#include <stdio.h>
#include <stdlib.h>
#include "jpeglib.h"

/*
http://www.syuhitu.org/other/jpeg/jpeg.html
を参考に 
*/ 

bmp_t* loadJpeg(const char* filename) {
	JSAMPARRAY img;
	bmp_t* resultbmp;
	struct jpeg_decompress_struct cinfo;
	struct jpeg_error_mgr jerr;
	FILE* infile;
	int i;
	int prevscanline;
	img=(JSAMPARRAY)malloc(sizeof(JSAMPROW));
	cinfo.err = jpeg_std_error(&jerr);
	jpeg_create_decompress( &cinfo );
	infile=fopen(filename,"rb");
	if(infile==NULL) {
		free(img);
		return NULL;
	}
	jpeg_stdio_src(&cinfo,infile);
	jpeg_read_header(&cinfo,TRUE);
	jpeg_start_decompress(&cinfo);
	resultbmp=bmpMake(cinfo.output_width,cinfo.output_height);
	if(!resultbmp) {
		jpeg_destroy_decompress(&cinfo);
		fclose(infile);
		free(img);
		return NULL;
	}
	prevscanline=0;
	while( cinfo.output_scanline < cinfo.output_height ) {
		if(cinfo.output_scanline>=getBmpHeight(resultbmp)) {
			/*エラー、行が多過ぎる*/
			jpeg_destroy_decompress(&cinfo);
			fclose(infile);
			bmpFree(resultbmp);
			free(img);
			return NULL;
		}
		/*jpeg読み込み*/
		jpeg_read_scanlines(&cinfo,img,1);
		/*データ変換*/
		if(cinfo.output_scanline>prevscanline) {
			for(i=0;i<getBmpWidth(resultbmp);i++) {
				if(cinfo.out_color_components==1) {
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).r=img[0][i];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).g=img[0][i];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).b=img[0][i];
				} else {
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).r=img[0][i*3];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).g=img[0][i*3+1];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).b=img[0][i*3+2];
				}
			}
			prevscanline=cinfo.output_scanline;
		}
		free(img[0]);
	}
	jpeg_finish_decompress(&cinfo);
	jpeg_destroy_decompress(&cinfo);
	fclose(infile);
	free(img);
	return resultbmp;
}
エラー内容は
JPEG Parameter struct mismatch: library thinks size is 432,
caller expects 464
です。
どうしたらjpegが読み込めるようになるのでしょうか?
教えていただければ幸いです。
よろしくお願いします。

Re: libjpegでエラー

Posted: 2011年12月17日(土) 19:20
by beatle
http://d.hatena.ne.jp/mooz/20081112/p1
が参考になるような気がします

Re: libjpegでエラー

Posted: 2011年12月17日(土) 19:29
by みけCAT
できました。ありがとうございます。

コード:

#include "imageaes.h"
#define XMD_H
#include <stdio.h>
#include <stdlib.h>
#define HAVE_BOOLEAN
typedef unsigned char boolean;
#include "jpeglib.h"

/*
http://www.syuhitu.org/other/jpeg/jpeg.html
を参考に 
*/ 

bmp_t* loadJpeg(const char* filename) {
	JSAMPARRAY img;
	bmp_t* resultbmp;
	struct jpeg_decompress_struct cinfo;
	struct jpeg_error_mgr jerr;
	FILE* infile;
	int i;
	int prevscanline;
	img=(JSAMPARRAY)malloc(sizeof(JSAMPROW));
	cinfo.err = jpeg_std_error(&jerr);
	jpeg_create_decompress( &cinfo );
	infile=fopen(filename,"rb");
	if(infile==NULL) {
		free(img);
		return NULL;
	}
	jpeg_stdio_src(&cinfo,infile);
	jpeg_read_header(&cinfo,TRUE);
	jpeg_start_decompress(&cinfo);
	resultbmp=bmpMake(cinfo.output_width,cinfo.output_height);
	if(!resultbmp) {
		jpeg_destroy_decompress(&cinfo);
		fclose(infile);
		free(img);
		return NULL;
	}
	img[0]=(JSAMPROW)malloc(sizeof(JSAMPLE)*
		cinfo.out_color_components*cinfo.output_width);
	prevscanline=0;
	while( cinfo.output_scanline < cinfo.output_height ) {
		if(cinfo.output_scanline>=getBmpHeight(resultbmp)) {
			/*エラー、行が多過ぎる*/
			jpeg_destroy_decompress(&cinfo);
			fclose(infile);
			bmpFree(resultbmp);
			free(img[0]);
			free(img);
			return NULL;
		}
		/*jpeg読み込み*/
		jpeg_read_scanlines(&cinfo,img,1);
		/*データ変換*/
		if(cinfo.output_scanline>prevscanline) {
			for(i=0;i<getBmpWidth(resultbmp);i++) {
				if(cinfo.out_color_components==1) {
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).r=img[0][i];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).g=img[0][i];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).b=img[0][i];
				} else {
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).r=img[0][i*3];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).g=img[0][i*3+1];
					getBmpXY(resultbmp,i,cinfo.output_scanline-1).b=img[0][i*3+2];
				}
			}
			prevscanline=cinfo.output_scanline;
		}
	}
	jpeg_finish_decompress(&cinfo);
	jpeg_destroy_decompress(&cinfo);
	fclose(infile);
	free(img[0]);
	free(img);
	return resultbmp;
}