0

libpng を opengl C++ プログラムで動作させるのに苦労しています。png をテクスチャとして読み込もうとしています。libpng16 ソース コードをダウンロードし、Visual Studio 2010 を使用してビルドしました。lib ファイルを正しくリンクし、png.h ファイルを含めました。

プロジェクトをビルドすると、libpng は「libpng エラー: 読み取りエラー」をコンソールに出力し、他には何も出力しません。libpng プロジェクトのランタイム構成を変更して、それを使用しているプロジェクトと一致させるなど、インターネットで見つけたすべてのソリューションを試しました。

png_read_png 関数でエラーが発生します。

    FILE * file = fopen(filename,"r");
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING , NULL ,NULL , NULL );
if ( png_ptr == NULL )
{
printf ( "Could not initialize libPNG ’s read struct.\n" ) ;
exit(-1);
}
png_infop png_info_ptr = png_create_info_struct(png_ptr) ;
if ( png_info_ptr == NULL )
{
printf ("Could not initialize libPNG ’s info pointer.\n");
exit ( -1) ;
}
if (setjmp(png_jmpbuf(png_ptr)))
{

  printf ( "LibPNG encountered an error.\n" ) ;
 png_destroy_read_struct(&png_ptr, &png_info_ptr ,NULL );
  exit( -1);
}

png_init_io ( png_ptr , file );
png_read_png ( png_ptr , png_info_ptr , 0 , NULL ) ;
png_uint_32 png_width = 0;
png_uint_32 png_height = 0;
int bits = 0;
int colour_type = 0;
png_get_IHDR ( png_ptr , png_info_ptr , & png_width , & png_height ,& bits , & colour_type ,NULL , NULL , NULL );
const unsigned BITS_PER_BYTE = 8;
unsigned bytes_per_colour = (unsigned)bits/ BITS_PER_BYTE ;
unsigned colours_per_pixel;

if ( colour_type == PNG_COLOR_TYPE_RGB)
{
  colours_per_pixel = 3;
}
else
{
printf ( " Colour types other than RGB are not supported." ) ;
exit ( -1) ;
}
printf ( "png_width = %d, png_height = %d , bits = %d, colour type = %d. \n" , png_width , png_height , bits , colour_type );
unsigned char * data = new unsigned char [ png_width * png_height * colours_per_pixel * bytes_per_colour];
png_bytepp row_pointers = png_get_rows ( png_ptr , png_info_ptr ) ;
unsigned index = 0;
for ( unsigned y = 0; y < png_height ; y ++)
{
  unsigned x = 0;
  while ( x < png_width * colours_per_pixel * bytes_per_colour) {
data [index++] = row_pointers [y][x++];
data [index++] = row_pointers [y][x++];
data [index++] = row_pointers [y][x++];
  }
}

正しいファイル名が渡されていることを確認し、複数の異なる PNG を試しました

これに関する任意の支援をいただければ幸いです

ありがとう

4

1 に答える 1

1

Windows では、画像ファイルをバイナリモードで開く必要があります。そうしないと、単一の . 現在、テキスト モードである標準モードでファイルを開いています。モード文字列に「b」を追加すると、バイナリモードで開くことができます。

FILE * file = fopen(filename,"rb");
于 2013-05-27T00:42:46.433 に答える