3

我正在为 iPad 开发 iOS 应用程序,我使用 Grabkit 从 Facebook、Twitter、Flicker 和相机胶卷中获取图像。要从最后一张中获取图像,我需要将 CGImage 转换为 UIImage,但我遇到了麻烦。就像我没有得到任何图像一样,因为当我稍后使用 UIImage 时,应用程序会因以下日志而崩溃:

 *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [nan 653]'

我正在使用以下代码来转换 CGImage:

UIImage* image = [UIImage imageWithCGImage:imgRef];

所以这段代码不会崩溃,但是当我使用创建的图像时,它会崩溃。怎么了?代码错了吗?

4

2 回答 2

12

你应该像这样使用 alloc initUIImage* myImage = [[UIImage alloc] initWithCGImage:myCGImage];

或者你可以试试这个:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSUInteger width = CGImageGetWidth(image);
NSUInteger height = CGImageGetHeight(image);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
int size = height*width*bytesPerPixel;
unsigned char *rawData = malloc(size); 
CGContextRef context = CGBitmapContextCreate(rawData,width,height,bitsPerComponent,bytesPerRow,colorSpace,kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0,0,width,height),image);
UIImage *newImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
CGContextRelease(context);    
free(rawData);
于 2013-07-10T16:39:19.460 回答
0

很好的建议,帮助我解决了内存泄漏问题。释放分配的内存非常重要。当你这样做时:

        unsigned char* buffer = (unsigned char*)malloc( dataSize );

之后也这样做

        free(buffer);
于 2020-04-18T14:04:37.510 回答