PNGが読み込めない

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

PNGが読み込めない

#1

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

Windows Vista Home Premium SP2 32ビットです。
Dev-C++4.9.9.2です。
MSYS+gcc version 3.2.3でコンパイルしたlibpng 1.5.7とzlib 1.2.5を使用しています。
このコードを書いたのですが、png_create_read_structで失敗しているようです。

コード:

#include "imageaes.h"
#include <stdio.h>
#include <stdlib.h>
#include "png.h"

/*
http://gmoon.jp/png/
http://dencha.ojaru.jp/programs_07/pg_graphic_10a2.html
http://hi.baidu.com/xiaoyunhu/blog/item/ac5c1b553bfb7cc3b645ae3c.html
を参考に
*/ 

bmp_t* loadPng(const char* filename) {
	bmp_t*          bmp;
	FILE            *fp;
	unsigned char   header[8];
	png_structp     png_ptr;
	png_infop       info_ptr;
	png_uint_32     width, height;
	int             bit_depth, color_type, interlace_type;
	unsigned char   **image;
	int             i,j;
	/*PNG読み取り処理*/
	fp = fopen(filename, "rb");
	if(fp==NULL)return NULL;
	fread(header,1,8,fp);
	if(png_sig_cmp(header,0,8)) {
		fclose(fp);
		return NULL;
	}
	png_ptr = png_create_read_struct(
	                PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
	if(!png_ptr) {
		fclose(fp);
		return NULL;
	}
	info_ptr = png_create_info_struct(png_ptr);
	if(!info_ptr) {
		png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
		fclose(fp);
		return NULL;
	}
	png_init_io(png_ptr, fp);
	png_set_sig_bytes(png_ptr, 8);
	png_read_info(png_ptr, info_ptr);
	png_get_IHDR(png_ptr, info_ptr, &width, &height,
	                &bit_depth, &color_type, &interlace_type,
	                NULL, NULL);
	if (color_type == PNG_COLOR_TYPE_PALETTE)
		png_set_palette_to_rgb(png_ptr);
	if (color_type == PNG_COLOR_TYPE_GRAY)
		png_set_gray_to_rgb(png_ptr);
	image = (png_bytepp)malloc(height * sizeof(png_bytep));
	for (i = 0; i < height; i++)
	        image[i] = (png_bytep)malloc(png_get_rowbytes(png_ptr, info_ptr));
	png_read_image(png_ptr, image);
	/*画像の読み取り*/
	bmp=bmpMake(width,height);
	if(bmp) {
		for(i=0;i<width;i++) {
			for(j=0;j<height;j++) {
				getBmpXY(bmp,i,j).r=image[j][i*3];
				getBmpXY(bmp,i,j).g=image[j][i*3+1];
				getBmpXY(bmp,i,j).b=image[j][i*3+2];
			}
		}
	}
	/*PNGの開放*/
	for (i = 0; i < height; i++) free(image[i]);
	free(image);
	png_destroy_read_struct(
	        &png_ptr, &info_ptr, (png_infopp)NULL);
	fclose(fp);
	/*画像を返す*/
	return bmp;
}
どうすればPNGを読み込むことができるようになるでしょうか?
お教えていただければ幸いです。
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: PNGが読み込めない

#2

投稿記事 by ISLe » 13年前

こちらでは読み込み自体はできて、フォーマット変換指定が反映されてなかったためバッファオーバーランが発生。freeで落ちるという症状でした。

症状が違うようですが、いちおうコメントに書いてあるURLの2番目のサイトを参考にして修正したところ正しく読み込むことができるようになりました。

変更箇所は以下のとおりです。

52行目と53行目の間に
png_read_update_info(png_ptr, info_ptr);
を挿入。
56行目と57行目の間に
png_read_end(png_ptr, NULL);
を挿入。

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

Re: PNGが読み込めない

#3

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

GTKをインストールしていた影響で、違うバージョンのlibpngがリンクされていたことが原因でした。
ツール>コンパイラオプションのディレクトリ>ライブラリの最初に.を追加したところうまく読み込めました。
ありがとうございました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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