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
地址开始,或从_pixels
缓冲区开始的i*bytesPerRow
地址开始。
因此,您可以使用创建行指针数组
_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.
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- C++ 读取访问冲突,0xCDCDCDCD