objective-c iphone uiimageview masking

objective c - JigSaw puzzle uiimage cultivo irregular



objective-c iphone (3)

//Create our colorspaces imageColorSpace = CGColorSpaceCreateDeviceRGB(); maskColorSpace = CGColorSpaceCreateDeviceGray(); provider=CGDataProviderCreateWithCFData((__bridge CFDataRef)self.puzzleData); image=CGImageCreateWithPNGDataProvider(provider, NULL, true, kCGRenderingIntentDefault); CGDataProviderRelease(provider); //Resize the puzzle image context = CGBitmapContextCreate(NULL, kPuzzleSize, kPuzzleSize, 8, 0, imageColorSpace, kCGImageAlphaPremultipliedFirst); CGContextDrawImage(context, CGRectMake(0, 0, kPuzzleSize, kPuzzleSize), image); CGImageRelease(image); image = CGBitmapContextCreateImage(context); CGContextRelease(context); //Create the image view with the puzzle image self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kPuzzleSize, kPuzzleSize)]; [self.imageView setImage:[UIImage imageWithCGImage:image]]; //Create the puzzle pieces (note that pieces are rotated to the puzzle orientation in order to minimize the number of graphic operations when creating the puzzle images) for(i = 0; i < appDelegate().puzzleSize * appDelegate().puzzleSize; ++i) { //Recreate the piece view [pieces[i] removeFromSuperview]; pieces[i] = [[CJPieceView alloc] initWithFrame:CGRectMake(0, 0, kPieceSize, kPieceSize) index:i]; [pieces[i] setTag:-1]; //Load puzzle piece mask image UIImage *maskimage=[self.arrmaskImages objectAtIndex:i]; NSData *dataMaskImage=UIImagePNGRepresentation(maskimage); provider=CGDataProviderCreateWithCFData((__bridge CFDataRef)dataMaskImage); tile = CGImageCreateWithPNGDataProvider(provider, NULL, true, kCGRenderingIntentDefault); CGDataProviderRelease(provider); mask = CGImageCreateCopyWithColorSpace(tile, maskColorSpace); CGImageRelease(tile); context = CGBitmapContextCreate(NULL, kPieceSize / kPieceShadowFactor, kPieceSize / kPieceShadowFactor, 8, 0, imageColorSpace, kCGImageAlphaPremultipliedFirst); CGContextClipToMask(context, CGRectMake(0, 0, kPieceSize / kPieceShadowFactor, kPieceSize / kPieceShadowFactor), mask); CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0); CGContextFillRect(context, CGRectMake(0, 0, kPieceSize / kPieceShadowFactor, kPieceSize / kPieceShadowFactor)); shadow = CGBitmapContextCreateImage(context); CGContextRelease(context); imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kPieceSize, kPieceSize)]; [imageView setImage:[UIImage imageWithCGImage:shadow]]; [imageView setAlpha:kPieceShadowOpacity]; [imageView setUserInteractionEnabled:NO]; [pieces[i] addSubview:imageView]; CGImageRelease(shadow); //Create image view with piece image and add it to the piece view context = CGBitmapContextCreate(NULL, kPieceSize, kPieceSize, 8, 0, imageColorSpace, kCGImageAlphaPremultipliedFirst); CGRect rectPiece= CGRectMake(fmodf(i, appDelegate().puzzleSize) * kPieceDistance, (floorf(i / appDelegate().puzzleSize)) * kPieceDistance, kPieceSize, kPieceSize); [self.arrlocations addObject:[NSValue valueWithCGRect:rectPiece]]; CGContextTranslateCTM(context, (kPieceSize - kPieceDistance) / 2 - fmodf(i, appDelegate().puzzleSize) * kPieceDistance, (kPieceSize - kPieceDistance) / 2 - (appDelegate().puzzleSize - 1 - floorf(i / appDelegate().puzzleSize)) * kPieceDistance); CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image); subImage = CGBitmapContextCreateImage(context); CGContextRelease(context); tile = CGImageCreateWithMask(subImage, mask); imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kPieceSize, kPieceSize)]; [imageView setImage:[UIImage imageWithCGImage:tile]]; [imageView setUserInteractionEnabled:NO]; [pieces[i] addSubview:imageView]; CGImageRelease(tile); CGImageRelease(subImage); DLog(@"%f", pieces[i].frame.size.width); pieces[i].transform=CGAffineTransformScale(CGAffineTransformIdentity, kTransformScale, kTransformScale); DLog(@"%f %f",kTransformScale, pieces[i].frame.size.width); //Release puzzle piece mask; CGImageRelease(mask); } //Clean up CGColorSpaceRelease(maskColorSpace); CGColorSpaceRelease(imageColorSpace); CGImageRelease(image);

Estoy desarrollando un rompecabezas para iphone.

Aquí, usando la técnica de enmascaramiento, recorté la imagen en 9 pedacitos. Ver la imagen a continuación.

Después de recortar, falta parte de la imagen debido al enmascaramiento. Sabía que esto se debe a cargar esas imágenes recortadas en forma cuadrada.

Mi pregunta es cómo hacer que sea una imagen recortada completa sin perder ninguna porción de la imagen y cómo ajustar estas piezas correctamente para que coincida con la original.


Construye un conjunto de máscaras correspondientes a cada pieza del rompecabezas. Cada máscara debe tener el tamaño de la imagen original y todo negro, excepto un área blanca con la posición y la forma de la pieza del rompecabezas. Además, mantenga un rectángulo delimitador para cada pieza (un rectángulo que contiene mínimamente la pieza en la imagen de la máscara).

La forma de no perder nada de la imagen original es organizar las máscaras (y las rectas de limitación correspondientes) como una partición sobre la imagen.

Aquí hay un enlace a un código que muestra cómo aplicar una máscara. Una vez que se aplica la máscara, recorta la imagen enmascarada al rectángulo delimitador usando código como aquí y en cualquier otro lugar.


También estoy pensando en dividir la imagen original con el enmascaramiento, pero podría ser una mala idea para nosotros y también complicada de manejar. Entonces, para el usuario que es principiante en el rompecabezas , esta es la mejor pregunta / respuesta y también puede obtener el código fuente del juego de rompecabezas de git.

Por favor, felicitaciones a este hombre (@ "Guntis Treulands") que resuelve tu problema. Sé que esto no debería ser una respuesta, pero debería ser un comentario, pero si lo voy a poner como un comentario, entonces puede ser un usuario que tiene un problema con un rompecabezas que no puede encontrar fácilmente. Lo estoy poniendo como una respuesta.