调用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已成功调用过。
我不知道我在做什么错。文档中没有关于该功能的有趣信息,因此它应该不会太复杂。

最佳答案

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

现在,您仍然可以使用与保存数据的缓冲区相同的_pixels,但是必须提供一个_row_pointers数组,用于指示png_read_image该行在该缓冲区中的位置。假设您要按行顺序将数据存储在该_pixels缓冲区中,那么每一行将从一个地址开始,该地址是上一个地址的bytesPerRowi*bytesPerRow缓冲区的起始位置的_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一样将_pixels = new unsigned char[bytesPerRow * _height];分配为连续的内存块

10-06 01:42