png_read_image 访问冲突?
png_read_image access violation?
我在调用 png_read_image
时不断收到 Access violation writing location 0x....
错误。这是我的代码
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
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];
所做的一样
调用完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.
我在调用 png_read_image
时不断收到 Access violation writing location 0x....
错误。这是我的代码
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
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];
调用完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.