2012-04-05 18 views
5

stworzyłem funkcję dzielenia obrazu na wielu obrazach, ale kiedy biorę wziąć CGImage z UIImage The CGImage zwraca NULLCGImage z UIImage zwróci 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

check tempArray jest null lub nie w ostatniej – Hector

+1

CGImage nie jest obiektem, jest to C struct, więc nie powinno być za pomocą NSLog z% @. – lnafziger

+0

Problem polegał na tym, że stworzyłem UIImage z IOSurface: D – Otium

Odpowiedz

4

Obiekt CGImage zwróci nil, jeśli UIImage został stworzony z innego obrazu, takich jak IOSurface lub CIImage. Aby obejść ten problem w tym konkretnym przypadku, mogę utworzyć obraz CG z IOSurface za pomocą funkcji c, a następnie przekonwertować go do obiektu UII.

UICreateCGImageFromIOSurface(IOSurfaceRef surface); 
2

Co zrobiłeś teraz jest po prostu stworzyć kawałki z 0.f szerokość, należy użyć dwóch for s, aby zdefiniować width & height dla swoich sztuk. Próbka kodu podobna do tej (nie testowana jeszcze, ale powinna działać):

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 Mam (przetestowany) kod, który to robi i pasuje do twojej sugestii. Kopalnia jest pakowana jako metoda kategorii na UIImage o nazwie subimageInRect: (CGRect) rect. Myślę, że to ładniejsza droga. – danh

1

Zdarza się to w niektórych przypadkach, gdy próbujemy przyciąć obraz. Znalazłem rozwiązanie jak to spróbuj to może być to może pomóc: -

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

Stworzyłem UIImage z CGImage.

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

A teraz newImage.CGImage nie nil

Powiązane problemy