Lettre de récolte de l'image en utilisant Masking

Ce dont j'ai besoin:

1) Choisissez l'image de la bibliothèque ou de la camera

2) Ecrire et text

3) Le text est rogné avec l'image!

Ci-dessous l'image peut clarifier plus sur ce dont j'ai exactement besoin.

entrez la description de l'image ici

Je sais masquer et le recadrage de l'image même que j'ai fait masquage avec cadre dans emoji moi app . Juste j'ai besoin de savoir comment l'image doit être recadrée en fonction du text dynamic.

S'il vous plaît donner vos suggestions.

... UIImage *image = [UIImage imageNamed:@"dogs.png"]; UIImage *mask = [UIImage imageNamed:@"mask.png"]; // result of the masking method UIImage *maskedImage = [self maskImage:image withMask:mask]; ... - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef maskedImageRef = CGImageCreateWithMask([image CGImage], mask); UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef]; CGImageRelease(mask); CGImageRelease(maskedImageRef); // returns new image with mask applied return maskedImage; } 

1) écrire une image avec du text avec le code ci-dessous

 UIImage *textdImage = [self imageFromText:@"Text to show"]; -(UIImage *)imageFromText:(NSSsortingng *)text { //set width for ssortingng to wrap. CGSize maximumSize; maximumSize = CGSizeMake(320, 300); //set your text image font here UIFont *font = [UIFont boldSystemFontOfSize:50]; CGSize strSize1 = [text sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:UILineBreakModeWordWrap]; CGSize strSize =CGSizeMake(320, strSize1.height); if (UIGraphicsBeginImageContextWithOptions != NULL) UIGraphicsBeginImageContextWithOptions(strSize,NO,0.0); else UIGraphicsBeginImageContext(strSize); //set your new text iamge frame here CGRect newframe = CGRectMake(0, 0, 320, 400); UIColor *color = [UIColor redColor]; [color set]; [text drawInRect:newframe withFont:font lineBreakMode:UILineBreakModeCharacterWrap alignment:UITextAlignmentCenter]; UIImage *textImg = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return textImg; } 

2) après l'obtention de l'image de texture appliquer la création d'image avec l'image requirejse

 UIImage *maskedImage = [self maskImage:finalImage withMask: textdImage]; - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //UIImage *maskImage = [UIImage imageNamed:@"mask.png"]; CGImageRef maskImageRef = [maskImage CGImage]; // create a bitmap graphics context the size of the image CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); if (mainViewContentContext==NULL) return NULL; CGFloat ratio = 0; ratio = maskImage.size.width/ image.size.width; if(ratio * image.size.height < maskImage.size.height) { ratio = maskImage.size.height/ image.size.height; } CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}}; CGRect rect2 = {{-((image.size.width*ratio)-maskImage.size.width)/2 , -((image.size.height*ratio)-maskImage.size.height)/2}, {image.size.width*ratio, image.size.height*ratio}}; CGContextClipToMask(mainViewContentContext, rect1, maskImageRef); CGContextDrawImage(mainViewContentContext, rect2, image.CGImage); // Create CGImageRef of the main view bitmap content, and then // release that bitmap context CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext); CGContextRelease(mainViewContentContext); UIImage *theImage = [UIImage imageWithCGImage:newImage]; CGImageRelease(newImage); // return the image return theImage; } 

Voici une approche CoreAnimation. Vous pouvez utiliser une CATextLayer pour masquer une couche avec une image. C'est un code un peu plus compact:

 // Create our text layer we want to use as a mask CATextLayer *textLayer = [CATextLayer layer]; [textLayer setBounds:CGRectMake(0.0f, 0.0f, 300.0f, 300.0f)]; [textLayer setFont:@"Helvetica-Bold"]; [textLayer setFontSize:42.0f]; [textLayer setAnchorPoint:CGPointMake(0.0f, 0.0f)]; [textLayer setPosition:CGPointMake(0.0f, 0.0f)]; [textLayer setWrapped:YES]; [textLayer setAlignmentMode:kCAAlignmentCenter]; [textLayer setSsortingng:@"Hello World And Something Something!!"]; // Create our image layer CALayer *imageLayer = [CALayer layer]; [imageLayer setBounds:CGRectMake(0.0f, 0.0f, 300.0f, 300.0f)]; [imageLayer setPosition:[[self view] center]]; [imageLayer setContents:(id)[[UIImage imageNamed:@"pp"] CGImage]]; // Set the mask [imageLayer setMask:textLayer]; // Add the layer to the view's layer tree [[[self view] layer] addSublayer:imageLayer]; 

Cela donnera les résultats suivants:

entrez la description de l'image ici

Vous pouvez jouer avec le visage et la taille de la police. CATextLayers peut envelopper automatiquement en fonction de la taille à laquelle vous les définissez. Vous pouvez également définir l'alignment du text sur la couche de text pour répondre à vos besoins.

NOTE: Une mise en garde ici. Si vous avez besoin de la sortie en tant qu'image, cela ne fonctionnera pas car vous ne pouvez pas afficher les masques en utilisant renderInContext: sur la couche. Cette méthode ne fonctionne que si vous prévoyez de l'afficher dans une vue. La sortie d'une image nécessite l'approche CoreGraphics.