2012-04-05 56 views
5

我創建了一個函數的圖像分割成多個圖像,但是當我拿拿的UIImage的CGImage,在CGImage返回NULL的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; 



} 
+0

檢查tempArray爲空或不是在最後 – Hector 2012-04-05 04:22:25

+1

CGImage是不是一個對象,它是一個C結構,所以你不應該使用的NSLog與%@。 – lnafziger 2012-04-05 04:24:37

+0

問題是我用IOSurface創建了UIImage:D – Otium 2012-04-05 04:28:46

回答

4

的CGImage屬性將返回零如IOSurface或CIImage。爲了解決這個問題,我可以使用c函數從IOSurface創建CGImage,然後將其轉換爲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我有(測試)代碼,這樣做,它符合你的建議。 Mine在UIImage上打包爲一個名爲subimageInRect:(CGRect)rect的類別方法。我認爲這是一種更漂亮的方式。 – danh 2012-04-05 04:28:25

1

它發生在某些情況下,當我們嘗試裁剪圖像。我發現這樣的解決方案嘗試,這可能是這可以幫助你: - 如果UIImage的是從另一個形象創造

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

我從CGImage創建了UIImage

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

現在newImage.CGImagenil