2014-05-09 14 views
22

Sto provando a scrivere una funzione per convertire il testo del testo in un'immagine (example). Ho provato a cercare un esempio, la maggior parte del campione sovrascrive anche il testo sull'immagine. È possibile darmi qualche esempio o suggerimenti su come farlo?Come convertire il testo in Immagine?

+0

ho bisogno di questa funzione è perché ottengo i dati dal server. se i dati avevano un'immagine, allora UIIMAGEView mostrerà l'immagine, ma se non hai immagine, allora ho bisogno di convertire la parte del contenuto in immagine e mostrarla su UIIMAGEVIEW. – Lazarus

+0

Dai un'occhiata alla mia soluzione qui. Swift 3: [Conversione di testo in UIImage iOS] (http://stackoverflow.com/a/43109230/6665075) –

+0

Vedere [la risposta di Swift 4/iOS 11 per una domanda simile] (https://stackoverflow.com/a/45821857/1966109) che mostra fino a 6 diversi modi per convertire il testo in un'immagine (o una vista) per visualizzarlo. –

risposta

49

Sono possibili diversi approcci.

  1. Se si dispone di un esistente UITextField, UITextView o UILabel che si desidera solo per il rendering come immagine, è possibile utilizzare gli approcci istantanee tradizionali, come ad esempio:

    - (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. Se si voleva un la routine generica "crea immagine da testo", in iOS 7, sarebbe simile a:

    - (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; 
    } 
    

    Quanto sopra creerà un'immagine la cui dimensione varierà in base al testo. Chiaramente, se si desidera un'immagine a dimensione fissa, utilizzare le costanti frame anziché creare dinamicamente.

    In ogni caso, è possibile quindi utilizzare il sopra in questo modo:

    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. Se è necessario supportare le versioni precedenti di iOS, è possibile utilizzare questa tecnica:

    - (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; 
    } 
    

ci sono molte, molte permutazioni di ognuna di queste. Dipende solo da ciò che stai cercando di ottenere.


Un altro approccio è quello di avere semplicemente sia UIImageView e UILabel/UITextView oggetti nella vista, e se si dispone di un'immagine dal server, impostare l'immagine del UIImageView, e il testo, impostare la text del UILabel/UITextView.

+0

Bella risposta! Se è necessario convertire il testo colorato in un'immagine per qualcosa che è stampabile, ad es. a UIBarButtonItem, hai due opzioni: 1) imposta il colore della tinta per l'oggetto, ad esempio: [buttonItem setTintColor: color]; 2) specificare la modalità di rendering prima di restituire l'immagine, come: return [image imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]; –

+0

@Rob anche se questa è una risposta molto vecchia ... vorrei implementare l'opzione (3) dalla tua risposta. Ma il suo testo di collocamento a sinistra è allineato. Come posso renderlo allineato al centro? Voglio solo due lettere nell'immagine. –

+0

Perché non l'opzione 2? In tal caso hai http://stackoverflow.com/a/477658/1271826. Se non lo fai, devi calcolare manualmente il rettangolo di delimitazione che una riga di testo prenderà e quindi compensare l'origine di dove la disegni per la giusta quantità. L'opzione 2 è molto più semplice. – Rob

3

Si potrebbe provare a creare il proprio personalizzato UIView sottoclasse, disegnando un NSString su di esso (il testo), quindi la conversione che a un UIImage. È possibile disegnare il testo su un UIView solo nel metodo -drawRect:. Ecco un'idea per la tua sottoclasse.

@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*/]; 
} 

Maggiori informazioni su disegno NSString s can be found here. Una volta visualizzata questa visualizzazione con il tuo testo, convertila in UIImage with this technique.

+0

ok, grazie. fammi provare questo – Lazarus

1

È semplice. Vuoi convertire il testo in UIImage. Solo draw text view's layer into Image context e convertire in UIImage. il codice è sotto

+ (UIImage *) imageWithView:(UITextView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

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

Si può iniziare con questo

1

risposta Swift

Se avete solo bisogno di ottenere un'un'immagine del contenuto visibile di una UIFieldView, UITextView o UILabel quindi è possibile utilizzare il seguente metodo .

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 speciale

Quando il contenuto di testo scorre fuori del telaio, ad esempio in un UITextView, la soluzione sopra catturerà solo l'area visibile. Per ottenere tutto, una soluzione è ridimensionare una copia della visualizzazione del testo alla dimensione della sua vista del contenuto prima di crearne un'immagine.

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 
} 

Note

  • si potrebbe anche solo ridimensionare la vista testo originale e quindi ridimensionare di nuovo. Tuttavia, sembrava più semplice fare solo una copia temporanea.
  • Un altro modo per ottenere una copia di una vista è archive and unarchive it.
  • Oppure è possibile scrivere direttamente su UIImage.
0
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; 

voglio presentare in vista tabella così sto scrivendo questo codice nella cella per la riga nel percorso di indice.

(dataDict è il mio dizionario in cui ho ricevuto tutti i miei dati).

Problemi correlati