png_read_image访问违规?

时间:2015-02-21 21:37:58

标签: c++ png libpng

调用Access violation writing location 0x....时,我一直收到png_read_image错误。这是我的代码

unsigned int bytesPerRow = png_get_rowbytes(_pngPtr, _pngInfoPtr);
_pixels = new unsigned char[bytesPerRow * _height];

png_read_image(_pngPtr, &_pixels);

请注意,之前已成功调用png_read_info。 我无法弄清楚我做错了什么。文档说没有关于该功能的任何有趣内容,所以它不应该太复杂。

2 个答案:

答案 0 :(得分:2)

png_read_image需要一个行指针数组,而不是指向原始数据缓冲区的指针。换句话说,每行必须有一个这样的指针。

现在您仍然可以使用与保存数据的缓冲区相同的_pixels,但是您必须提供一个_row_pointers数组,该数组指示行位于该缓冲区中的png_read_image。假设您希望在_pixels缓冲区中按行顺序存储数据,则每行将从前一个地址bytesPerRow开始,或者从i*bytesPerRow开始。 {1}}缓冲区。

您可以使用以下命令创建行指针数组:

_pixels

其中_row_pointers = new png_bytep[_height]; for (int i=0; i<_height; i++) { _row_pointers[i] = _pixels + i*bytesPerRow; } png_read_image(_pngPtr, _row_pointers); 已被分配为连续的内存块,就像使用_pixels

一样

答案 1 :(得分:1)

调用png_set_something()后,调用png_read_update_info(),然后调用bytesPerRow = png_get_rowbytes()。

如果在png_get_IHDR()之后立即调用png_get_rowbytes(),然后在此之后设置任何变换,则bytesPerRow可能太小而且您将获得访问冲突。

编辑2017年7月3日:我刚刚将此修订版推送到libpng文档(libpng.3,libpng-manual.txt):

    rowbytes       - number of bytes needed to hold a row
+                     This value, the bit_depth, color_type,
+                     and the number of channels can change
+                     if you use transforms such as
+                     png_set_expand(). See
+                     png_read_update_info(), below.