¿Cómo convertir text a image?

Estoy intentando escribir una function para convertir el text del campo de text en una image ( ejemplo ). He intentado search un ejemplo, la mayoría de la muestra también sobrescribe text en la image. ¿Es posible darme un ejemplo o pistas sobre cómo hacer eso?

Varios enfoques son posibles.

  1. Si tiene un UITextField , UITextView o UILabel que solo desea representar como una image, puede emplear los enfoques tradicionales de instantáneas, como por ejemplo:

     - (UIImage *)imageForView:(UIView *)view { UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0); if ([view respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; // if we have efficient iOS 7 method, use it ... else [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // ... otherwise, fall back to tried and true methods UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 
  2. Si desea una rutina genérica de "crear imágenes a partir de text", en iOS 7, se vería así:

     - (UIImage *)imageFromString:(NSString *)string attributes:(NSDictionary *)attributes size:(CGSize)size { UIGraphicsBeginImageContextWithOptions(size, NO, 0); [string drawInRect:CGRectMake(0, 0, size.width, size.height) withAttributes:attributes]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

    Lo anterior creará una image cuyo tamaño variará según el text. Claramente, si solo desea una image de tamaño fijo, use frame constantes, en lugar de buildlo dinámicamente.

    De todos modos, entonces podrías usar lo anterior así:

     NSString *string = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; NSDictionary *attributes = @{NSFontAttributeName : [UIFont systemFontOfSize:20], NSForegroundColorAttributeName : [UIColor blueColor], NSBackgroundColorAttributeName : [UIColor clearColor]}; UIImage *image = [self imageFromString:string attributes:attributes size:self.imageView.bounds.size]; 
  3. Si necesita admitir versiones anteriores de iOS, puede usar esta técnica:

     - (UIImage *)imageFromString:(NSString *)string font:(UIFont *)font size:(CGSize)size { UIGraphicsBeginImageContextWithOptions(size, NO, 0); [string drawInRect:CGRectMake(0, 0, size.width, size.height) withFont:font lineBreakMode: NSLineBreakByWordWrapping]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

Hay muchas, muchas permutaciones de cada uno de estos. Simplemente depende de lo que intentas lograr.


Otro enfoque es simplemente tener los UIImageView y UILabel / UITextView en la vista, y si tiene una image del server, configure la image de UIImageView y el text, configure el text de UILabel / UITextView .

 NSString *string = @"Some text"; UIGraphicsBeginImageContext(CGSizeMake(80, 50)); [string drawAtPoint:CGPointMake(10, 20) withFont:[UIFont systemFontOfSize:12]]; UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

Puedes comenzar con esto

Puede intentar crear su propia subclass UIView personalizada, dibujar un NSString en él (su text) y luego convertirlo en un UIImage . Puede dibujar text en una UIView solo en el método -drawRect: Aquí hay una idea para su subclass.

 @interface TextView : UIView { NSString *_text; } - (id)initWithFrame:(CGRect)frame andText:(NSString *)text; @end @implementation TextView - (id)initWithFrame:(CGRect)frame andText:(NSString *)text { if (self = [super initWithFrame:frame]) { _text = text; } [self setNeedsDisplay]; // calls the -drawRect method return self; } - (void)drawRect:(CGRect)rect { [_text drawAtPoint:/* location of text*/ withAttributes:/* style of text*/]; } 

Puede encontrar más información sobre cómo dibujar NSString s aquí . Una vez que tengas esta vista con tu text, UIImage un UIImage con esta técnica .

Es sencillo. Desea convertir text a UIImage. Simplemente draw text view's layer into Image context y conviértalo en UIImage. El código está debajo.

 + (UIImage *) imageWithView:(UITextView *)view { UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } 

Respuesta rápida

Si solo necesita get una image del contenido visible de UIFieldView , UITextView o UILabel , puede usar el siguiente método.

 func imageFromView(myView: UIView) -> UIImage { UIGraphicsBeginImageContextWithOptions(myView.bounds.size, false, UIScreen.mainScreen().scale) myView.drawViewHierarchyInRect(myView.bounds, afterScreenUpdates: true) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } 

Caso especial

Cuando el contenido de text se desplaza fuera del marco, como en UITextView , la solución anterior solo capturará el área visible. Para get todo, una solución es cambiar el tamaño de una copy de la vista de text por el tamaño de su vista de contenido antes de hacer una image de ella.

 func imageFromTextView(textView: UITextView) -> UIImage { // Make a copy of the textView first so that it can be resized // without affecting the original. let textViewCopy = UITextView(frame: textView.frame) textViewCopy.attributedText = textView.attributedText // resize if the contentView is larger than the frame if textViewCopy.contentSize.height > textViewCopy.frame.height { textViewCopy.frame = CGRect(origin: CGPointZero, size: textViewCopy.contentSize) } // draw the text view to an image UIGraphicsBeginImageContextWithOptions(textViewCopy.bounds.size, false, UIScreen.mainScreen().scale) textViewCopy.drawViewHierarchyInRect(textViewCopy.bounds, afterScreenUpdates: true) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } 

Notas

  • También se puede cambiar el tamaño de la vista de text original y luego volver a cambiar su tamaño. Sin embargo, parecía más simple hacer una copy temporal.
  • Otra forma de get una copy de una vista es archivarla y desarchivarla .
  • O puede escribir directamente en un UIImage .
 NSString * ImgString = [[[self.dataDict valueForKey:@"newsItems"]objectAtIndex:indexPath.row]valueForKey:@"image"]; NSURL *imageURL = [NSURL URLWithString:ImgString]; NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; UIImage *image = [UIImage imageWithData:imageData]; cell.imageLabel.image = image; 

Quiero presentar en la vista de tabla, así que estoy escribiendo este código en la celda de la fila en la ruta del índice.

(dataDict es mi dictionary donde obtuve todos mis datos).