Problemas de performance al recortar UIImage (CoreGraphics, iOS)

La idea básica de lo que estamos tratando de hacer es que tenemos un gran UIImage, y queremos dividirlo en varias piezas. El usuario de la function puede pasar varias filas y número de columnas, y la image se recortará en consecuencia (es decir, 3 filas y 3 columnas dividen la image en 9 piezas). El problema es que estamos teniendo problemas de performance cuando intentamos lograr esto con CoreGraphics. La grilla más grande que necesitamos es 5×5, y la operación tarda varios segundos (que se registra como lagtime para el usuario). Por supuesto, esto está lejos de ser óptimo.

Mi colega y yo hemos pasado bastante time en esto, y hemos buscado en la web respuestas sin éxito. Ninguno de nosotros tiene mucha experiencia con Core Graphics, así que espero que haya algún error tonto en el código que solucione nuestros problemas. Queda a usted, SO usuarios, para ayudarnos a resolverlo.

Utilizamos el tutorial en http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/ para basar las revisiones de nuestro código en.

La function a continuación:

-(void) getImagesFromImage:(UIImage*)image withRow:(NSInteger)rows withColumn:(NSInteger)columns { CGSize imageSize = image.size; CGFloat xPos = 0.0; CGFloat yPos = 0.0; CGFloat width = imageSize.width / columns; CGFloat height = imageSize.height / rows; int imageCounter = 0; //create a context to do our clipping in UIGraphicsBeginImageContext(CGSizeMake(width, height)); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGRect clippedRect = CGRectMake(0, 0, width, height); CGContextClipToRect(currentContext, clippedRect); for(int i = 0; i < rows; i++) { xPos = 0.0; for(int j = 0; j < columns; j++) { //create a rect with the size we want to crop the image to //the X and Y here are zero so we start at the beginning of our //newly created context CGRect rect = CGRectMake(xPos, yPos, width, height); //create a rect equivalent to the full size of the image //offset the rect by the X and Y we want to start the crop //from in order to cut off anything before them CGRect drawRect = CGRectMake(rect.origin.x * -1, rect.origin.y * -1, image.size.width, image.size.height); //draw the image to our clipped context using our offset rect CGContextDrawImage(currentContext, drawRect, image.CGImage); //pull the image from our cropped context UIImage* croppedImg = UIGraphicsGetImageFromCurrentImageContext(); //PuzzlePiece is a UIView subclass PuzzlePiece* newPP = [[PuzzlePiece alloc] initWithImageAndFrameAndID:croppedImg :rect :imageCounter]; [slicedImages addObject:newPP]; imageCounter++; xPos += (width); } yPos += (height); } //pop the context to get back to the default UIGraphicsEndImageContext(); } 

¡CUALQUIER consejo muy apreciado!

originalImageView es un IBOutlet ImageView. Esta image se recortará.

 #import <QuartzCore/QuartzCore.h> 

QuartzCore se necesita para el borde blanco alnetworkingedor de cada corte para una mejor comprensión.

 -(UIImage*)getCropImage:(CGRect)cropRect { CGImageRef image = CGImageCreateWithImageInRect([originalImageView.image CGImage],cropRect); UIImage *cropedImage = [UIImage imageWithCGImage:image]; CGImageRelease(image); return cropedImage; } -(void)prepareSlices:(uint)row:(uint)col { float flagX = originalImageView.image.size.width / originalImageView.frame.size.width; float flagY = originalImageView.image.size.height / originalImageView.frame.size.height; float _width = originalImageView.frame.size.width / col; float _height = originalImageView.frame.size.height / row; float _posX = 0.0; float _posY = 0.0; for (int i = 1; i <= row * col; i++) { UIImageView *croppedImageVeiw = [[UIImageView alloc] initWithFrame:CGRectMake(_posX, _posY, _width, _height)]; UIImage *img = [self getCropImage:CGRectMake(_posX * flagX,_posY * flagY, _width * flagX, _height * flagY)]; croppedImageVeiw.image = img; croppedImageVeiw.layer.borderColor = [[UIColor whiteColor] CGColor]; croppedImageVeiw.layer.borderWidth = 1.0f; [self.view addSubview:croppedImageVeiw]; [croppedImageVeiw release]; _posX += _width; if (i % col == 0) { _posX = 0; _posY += _height; } } originalImageView.alpha = 0.0; } 

originalImageView.alpha = 0.0; Ya no verás el ImageImage original.

Llámalo así:

 [self prepareSlices:4 :4]; 

Debería hacer 16 cortes addSubView en self.view. Tenemos una aplicación de rompecabezas. Este es el código de trabajo desde allí.