UIImage的CGImage返回NULL

我创build了一个将图像分割成多个图像的function,但是当我把CGImage的UIImage,CGImage返回NULL

NSArray* splitImage(UIImage* image,NSUInteger pieces) { NSLog(@"width: %f, %zu",image.size.width,CGImageGetWidth(image.CGImage)); NSLog(@"%@",image.CGImage); returns NULL NSMutableArray* tempArray = [[NSMutableArray alloc]initWithCapacity:pieces]; CGFloat piecesSize = image.size.height/pieces; for (NSUInteger i = 0; i < pieces; i++) { // take in account retina displays CGRect subFrame = CGRectMake(0,i * piecesSize * image.scale ,image.size.width * image.scale,piecesSize * image.scale); CGImageRef newImage = CGImageCreateWithImageInRect(image.CGImage,subFrame); UIImage* finalImage =[UIImage imageWithCGImage:newImage]; CGImageRelease(newImage); [tempArray addObject:finalImage]; } NSArray* finalArray = [NSArray arrayWithArray:tempArray]; [tempArray release]; return finalArray; } 

如果UIImage是从另一个图像(如IOSurface或CIImage)创build的,则CGImage属性将返回nil。 为了解决这个问题,我可以使用c函数从IOSurface创build一个CGImage,然后将其转换为UIImage。

 UICreateCGImageFromIOSurface(IOSurfaceRef surface); 

你现在所做的只是创build0.f宽的部分 ,你应该使用两个s来定义你的作品的widthheight 。 这样的代码示例(尚未testing,但它应该工作):

 for (int height = 0; height < image.size.height; height += piecesSize) { for (int width = 0; width < image.size.width; width += piecesSize) { CGRect subFrame = CGRectMake(width, height, piecesSize, piecesSize); CGImageRef newImage = CGImageCreateWithImageInRect(image.CGImage, subFrame); UIImage * finalImage = [UIImage imageWithCGImage:newImage]; CGImageRelease(newImage); [tempArray addObject:finalImage]; } } 

我从CGImage创build了UIImage

 CIImage *ciImage = image.CIImage; CIContext *context = [CIContext contextWithOptions:nil]; CGImageRef ref = [context createCGImage:ciImage fromRect:ciImage.extent]; UIImage *newImage = [UIImage imageWithCGImage:ref]; 

现在newImage.CGImage不是nil

在某些情况下,我们尝试裁剪图像时会发生这种情况。 我发现这样的解决scheme尝试这可能是这可以帮助你:

 NSData *imageData = UIImageJPEGRepresentation(yourImage, 0.9); newImage = [UIImage imageWithData:imageData];