libjpegでエラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

libjpegでエラー

#1

投稿記事 by みけCAT » 13年前

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が読み込めるようになるのでしょうか?
教えていただければ幸いです。
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: libjpegでエラー

#2

投稿記事 by beatle » 13年前

http://d.hatena.ne.jp/mooz/20081112/p1
が参考になるような気がします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: libjpegでエラー

#3

投稿記事 by みけCAT » 13年前

できました。ありがとうございます。

コード:

#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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る