Когда я создаю CIImage, вызывая эту процедуру, я получаю ошибку malloc в заголовке. Когда я вызываю initWithBitmapData напрямую (не в рамках процедуры createCIUimageFromData), тогда он работает нормально.Выдача указателя Malloc не была назначена при вызове initWithBitmapData
Я видел ссылки на возможные ошибки в 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 createciimage\n");
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 ciimage\n");
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);
// . . .
}
Попробуйте 'freeWhenDone: NO' и освободите данные после того, как вы закончите с' CIImage'. – user3386109
Спасибо, что, похоже, сделали эту работу! Если вы добавите его в качестве ответа, я могу указать, что это был ответ. – user938797
@ user938797 Давайте подождем и посмотрим, может ли кто-нибудь сказать вам *** почему *** это ответ. Я просто догадывался :) Было бы полезно узнать, что происходит за кулисами, что вызывает проблему. Поэтому мы все знаем, чего следует избегать в будущем. – user3386109