2012-04-05 4 views
5

Я создал функцию для разбивки изображения на несколько изображений, но когда я беру взять CGImage из UIImage, то CGImage возвращает NULLCGImage из UIImage вернуть 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; 



} 
+0

проверка tempArray является недействительным или не в последнюю – Hector

+1

CGImage не является объектом, это C структура, так что вы не должны использовать NSLog с% @. – lnafziger

+0

Проблема заключалась в том, что я создал UIImage с помощью IOSurface: D – Otium

ответ

4

Свойство CGImage вернет ноль, если UIImage был создан из другого изображения, такие как IOSurface или CIImage. Чтобы обойти это в этом конкретном случае, я могу создать CGImage с IOSurface с помощью функции c, а затем преобразовать его в UIImage.

UICreateCGImageFromIOSurface(IOSurfaceRef surface); 
2

То, что вы сделали сейчас просто создать куски с 0.f ширина, вы должны использовать два for s для определения 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]; 
    } 
} 
+1

+1 У меня есть (протестированный) код, который делает это, и он соответствует вашему предложению. Шахта упакована как категорияный метод в UIImage, называемый subimageInRect: (CGRect) rect. Я думаю, что это лучший способ пойти. – danh

1

Это случается в некоторых случаях, когда мы пытаемся обрезать изображение. Я нашел решение, как это пытаются это может быть, это может помочь вам: -

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

Я создал UIImage из CGImage.

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

Смежные вопросы