9

我创建了一个用于将图像拆分为多个图像的函数,但是当我获取 UIImage 的 CGImage 时,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;



}
4

5 回答 5

7

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

UICreateCGImageFromIOSurface(IOSurfaceRef surface);
于 2012-04-05T20:22:08.203 回答
7

UIImageCGImage.

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

于 2017-01-24T13:29:40.557 回答
3

您现在所做的只是创建具有0.f 宽度的片段,您应该使用两个fors 为您的片段定义width& height。像这样的代码示例(尚未测试,但它应该可以工作):

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];
  }
}
于 2012-04-05T04:22:40.617 回答
1

在某些情况下,当我们尝试裁剪图像时会发生这种情况。我找到了这样的解决方案试试这可能对你有帮助:-

NSData *imageData = UIImageJPEGRepresentation(yourImage, 0.9);
newImage = [UIImage imageWithData:imageData];
于 2012-04-05T06:17:14.640 回答
1

使用此将 CGImage 转换为 UIImage 并且 cgImage 不会为空:

func convert(cmage:CIImage) -> UIImage
{       
    let context:CIContext = CIContext.init(options: nil)
    let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)!        
    let image:UIImage = UIImage.init(cgImage: cgImage)        
    return image
}
于 2018-07-03T11:29:24.030 回答