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.
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:
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.