プロが教える店舗&オフィスのセキュリティ対策術

24bppのrawファイルをPNGファイルに変換するプログラムをlibpngを使って以下の様に記述するのですが
runtime errorとなり実行時エラーとなってしまいます。
原因は
png_set_IHDR(png_ptr, info_ptr, width, height, // IHDRチャンク情報を設定します
24, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
で24を指定しているところと次のPNG_COLOR_TYPE_RGB,だと掴んでいるつもりなのですが
なぜうまくいかないのか分かりません。depthを指定するので24でいいのではないでしょうか?
どなたかlibpngをつかっての24bpp RawをPNGに変換する手法をご教授ください


int RawToPng(WCHAR *filename,int width,int height)
{

FILE *fpt_Raw;
unsigned char **image; // image[HEIGHT][WIDTH]の形式です
int i, j;
_wfopen_s(&fpt_Raw,filename,L"rb");
if(fpt_Raw==0x00)
{
MessageBox(NULL,L"File Open End",L"Error",MB_OK);
return -1;
}
else
{
#ifdef _DEBUG
MessageBox(NULL,L"File Open Success",L"OK",MB_OK);

WCHAR DebugStr[256];
wsprintf(DebugStr,L"width=%d,height=%d",width,height);
MessageBox(NULL,DebugStr,L"File Error",MB_OK);

#endif


image = (png_bytepp)malloc(height * sizeof(png_bytep)); // 以下3行は2次元配列を確保します
for (j = 0; j < height; j++)
{
image[j] = (png_bytep)malloc(3*width * sizeof(png_byte));
}


//全部読み込む
for(i=0;i<height;i++)
{
fread(&image[i][0],sizeof(unsigned char),3*width,fpt_Raw);
}


FILE *fpt_output;
_wfopen_s(&fpt_output,L"debug.raw",L"wb");
for(i=0;i<height;i++)
{
fwrite(&image[i][0],sizeof(unsigned char),3*width,fpt_output);
}
fclose(fpt_output);


// PNGファイルを作成します
FILE *fp;
png_structp png_ptr;
png_infop info_ptr;

_wfopen_s(&fp,L"RawToPNG.png",L"wb"); // まずファイルを開きます
png_ptr = png_create_write_struct( // png_ptr構造体を確保・初期化します
PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr); // info_ptr構造体を確保・初期化します
png_init_io(png_ptr, fp);// libpngにfpを知らせます

png_set_IHDR(png_ptr, info_ptr, width, height, // IHDRチャンク情報を設定します
24, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);


png_write_info(png_ptr, info_ptr); // PNGファイルのヘッダを書き込みます
png_write_image(png_ptr, image); // 画像データを書き込みます
png_write_end(png_ptr, info_ptr); // 残りの情報を書き込みます
png_destroy_write_struct(&png_ptr, &info_ptr); // 2つの構造体のメモリを解放します
fclose(fp);



for (j = 0; j < height; j++)
{
free(image[j]);
}// 以下2行は2次元配列を解放します
free(image);

A 回答 (1件)

depthは1チャンネルあたりのビット数です。


1画素あたりのビット数ではありません。
RGBの画像なら、3チャンネルと数えます。
ですから、 R,G,B各8ビットで合計3x8=24ビットなら、depthの指定は8です。

参考URL:http://dencha.ojaru.jp/programs_07/pg_graphic_10 …
    • good
    • 0
この回答へのお礼

ありがとうございますm(__)m
無事実装できました!
ありがとうございました!

お礼日時:2010/02/11 18:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!