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;
}
お教えていただければ幸いです。
よろしくお願いします。