我遇到崩溃并出现以下错误:
“CGDataProviderCreateWithCopyOfData:vm_copy 失败:状态 1。”
我有多个问题,您可以提供帮助。
vm_copy failed 中状态 1 代表什么?
仅当我在数据复制的内部 for 循环中设置断点时,才会发生此崩溃。然后恢复并删除断点。如果没有断点,函数会执行,但我会得到一个空白图像。如何确保即使我没有设置断点,此类崩溃也会被捕获并且应用程序停止执行?
当我执行 CGBitmapContextCreateImage 时出现此错误。有谁知道如何解决这个问题?
-(UIImage *) convertBitmapRGBA8ToUIImage:(UInt8**)img
:(int) width
:(int) height
{
CGImageRef inImage = m_inFace.img.CGImage;
UInt8*piData = calloc( width*height*4,sizeof(UInt8));
int iStep,jStep;
for (int i = 0; i < height; i++)
{
iStep = i*width*4;
for (int j = 0; j < width; j++)
{
jStep = j*4;
piData[iStep+jStep] =img[i][j];
piData[iStep+jStep+1] =img[i][j];
piData[iStep+jStep+2] = img[i][j];
}
}
CGContextRef ctx = CGBitmapContextCreate(piData,
CGImageGetWidth(inImage),
CGImageGetHeight(inImage),
CGImageGetBitsPerComponent(inImage),
CGImageGetBytesPerRow(inImage),
CGImageGetColorSpace(inImage),
CGImageGetBitmapInfo(inImage)
);
CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGContextRelease(ctx);
CGImageRelease(imageRef);
free(piData);
return finalImage;
}
The kern_return.h http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/osfmk/mach/kern_return.h头文件给出:
#define KERN_INVALID_ADDRESS 1
/* Specified address is not currently valid.
*/
这对应于相关的错误代码vm_copy failed: status 1
.
我怀疑这是与内存对齐相关的问题,因为vm_copy 文档 http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_copy.html指出地址必须位于页边界上.
为了确保您使用正确对齐的缓冲区,您应该分配您的piData
缓冲区的步幅与您的相同inImage
输入图像:
size_t bytesPerRow = CGImageGetBytesPerRow(inImage);
UInt8*piData = calloc(bytesPerRow*height,sizeof(UInt8));
然后用这个bytesPerRow
值而不是width*4
在你的for
循环,即:
iStep = i*bytesPerRow;
这应该可以解决您的问题(注意:我假设CGImageGetWidth(inImage)
and width
是相同的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)