CGImage转UIImage无法正常工作。

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];

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


imgRef是UIImageView还是仅仅是UIImage?如果它是一个视图,你必须使用imgRef.image。 - apollosoftware.org
如果CGImage为NULL,请使用断点进行检查。 - Andrea
您可以在此处找到所有代码:http://ves.cat/hc33 - Marti Serra Vivancos
顺便提一下,imgRef 是在这个问题中所看到的代码中创建的 CGImage:http://ves.cat/hc33 - Marti Serra Vivancos
2个回答

12

你应该像这样使用alloc init:UIImage* 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);

当我实现这个解决方案时,出现了以下错误。CGContextDrawImage: invalid context 0x0。这是一个严重的错误。此应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的总体降级。此通知是一种礼貌:请解决此问题。在即将到来的更新中,它将成为致命错误。 - Jacky Wang

0

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

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

之后也要做这个

        free(buffer);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接