调用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
缓冲区中,那么每一行将从一个地址开始,该地址是上一个地址的bytesPerRow
或i*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];
分配为连续的内存块