当我通过调用此例程创建 CIImage 时,我在标题中收到 malloc 错误。 当我直接调用 initWithBitmapData 时(不在 createCIUimageFromData 例程中),那么它工作正常。
我已经看到了对 iOS 中可能相关的错误的引用,但我不能确定,我当然怀疑我的代码比 Apple 的代码更多!
我的猜测是我的附加重定向以某种方式搞砸了事情,但是拥有单独的例程比将代码嵌入我需要的地方更干净。
谢谢。
失败:
- (CIImage *) createCIimageFromData : (unsigned char *)pData width : (int32_t)width height : (int32_t)height
{
/*
Once we have the raw data, we convert it into a CIImage.
The following code does the required work.
*/
NSLog(@"entering createciimagen");
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ];
CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef];
CGColorSpaceRelease(colorSpaceRef);
/*
newImage is the final image
Do remember to release the allocated parts.
*/
NSLog(@"done ciimagen");
return _dataCIImage;
}
工程:
void prepData(unsigned char *pData, // source-destination
int strideSrc, // stride
int width,
int height,
double amount,
int deltaLimit,
id owner)
{
//[owner createCIimageFromData:pData width:width height:height]; // <-- commented out
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ];
CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef];
CGColorSpaceRelease(colorSpaceRef);
// . . .
}
显然,当NSData
对象尝试释放数据时,会导致此问题。若要避免此问题,请使用 freeWhenDone:NO
,然后在完成CIImage
后释放数据。