libpng 错误:读取错误 (Visual Studio 2010)

Posted

技术标签:

【中文标题】libpng 错误:读取错误 (Visual Studio 2010)【英文标题】:libpng error: read error (Visual Studio 2010) 【发布时间】:2013-05-26 22:53:11 【问题描述】:

我一直在努力让 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

对此的任何帮助将不胜感激

谢谢

【问题讨论】:

【参考方案1】:

在 Windows 上,您必须以 binary 模式打开图像文件,否则任何出现的字节序列,可能被解释为将被转换为单个 .现在您以标准模式打开文件,即文本模式。您可以通过在模式字符串中添加“b”以二进制模式打开,即

FILE * file = fopen(filename,"rb");

【讨论】:

非常感谢!我不敢相信我找不到解决方案。你为我节省了很多时间。

以上是关于libpng 错误:读取错误 (Visual Studio 2010)的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 在 python 中显示错误“无法访问”

Lua 错误加载模块 'libpng' (Torch, MacOSX)

MacOSX下libpng的链接器错误

使用 libpng 过滤器

尝试使用 libpng 加载图像时 Windows 上的运行时错误

ubuntu 依赖问题