2014-05-09 18 views
22

Ich versuche, eine Funktion zu schreiben, das Textfeld ein Text zu einem Bild (example) zu konvertieren. Ich habe versucht, nach einem Beispiel zu suchen, das meiste des Beispiels ist auch Text auf Bild überschreiben. Ist es möglich, mir ein Beispiel oder Hinweise zu geben, wie das geht?Wie konvertiert man Text in Bild?

+0

Ich brauche diese Funktion ist, weil ich Daten vom Server bekomme. Wenn die Daten ein Bild haben, zeigt die UIIMAGEView das Bild an, aber wenn kein Bild vorhanden ist, muss ich den Teil des Inhalts in Bild umwandeln und auf der UIIMAGEVIEW anzeigen. – Lazarus

+0

Schauen Sie sich hier meine Lösung an. Swift 3: [Umwandlung von Text in UIImage iOS] (http://stackoverflow.com/a/43109230/6665075) –

+0

Siehe [meine Swift 4/iOS 11 Antwort für eine ähnliche Frage] (https://stackoverflow.com/a/45821857/1966109), die bis zu 6 verschiedene Möglichkeiten zeigt, Text in ein Bild (oder eine Ansicht) zu konvertieren, um es anzuzeigen. –

Antwort

49

Mehrere Ansätze sind möglich.

  1. Wenn Sie eine vorhandene UITextField, UITextView oder UILabel, die Sie gerade als ein Bild machen möchten, können Sie die traditionellen Schnappschuss Ansätze beschäftigen wie:

    - (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. Wenn Sie ein gesuchter generische "Bild aus Text erstellen" -Routine, in iOS 7 würde es aussehen wie:

    Das obige wird ein Bild erstellen deren Größe hängt vom Text ab. Wenn Sie nur ein Bild fester Größe wünschen, verwenden Sie die Konstanten frame, anstatt es dynamisch zu erstellen.

    Wie dem auch sei, könnten Sie dann die oben verwenden wie so:

    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. Wenn Sie früher iOS-Versionen unterstützen müssen, können Sie diese Technik verwenden könnte:

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

Es gibt viele, viele Permutationen von jedem von diesen. Es hängt nur davon ab, was Sie erreichen wollen.


Ein weiterer Ansatz ist einfach beide UIImageView haben und UILabel/UITextView Objekte in der Ansicht, und wenn Sie ein Bild von dem Server haben, setzen Sie das Bild des UIImageView und Text, stellen Sie die text der UILabel/UITextView.

+0

Schöne Antwort! Wenn Sie farbigen Text in ein Bild für etwas, das tönbar ist, z. Ein UIBarButtonItem, Sie haben zwei Optionen: 1) Legen Sie die Farbe für das Element, z. B .: [buttonItem setTintColor: color]; 2) Spezifizieren Sie den Rendering-Modus vor dem Zurückgeben des uiimage, wie: return [image imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]; –

+0

@Rob obwohl dies eine sehr alte Antwort ist ... ich möchte die Option (3) aus Ihrer Antwort implementieren. Aber sein Text wird linksbündig platziert. Wie kann ich es zentrieren ausrichten? Ich möchte nur zwei Buchstaben im Bild haben. –

+0

Warum nicht Option 2? In diesem Fall haben Sie http://StackOverflow.com/a/477658/1271826. Wenn Sie dies nicht tun, müssen Sie das Begrenzungsrechteck, das eine Textzeile benötigt, manuell berechnen und dann den "Ursprung" der Stelle, an der Sie es zeichnen, um den richtigen Betrag versetzen. Option 2 ist viel einfacher. – Rob

3

Sie könnten versuchen, Ihre eigene UIView Unterklasse zu schaffen, ein NSString darauf (Ihr Text) zeichnen, dann, dass zu einem UIImage konvertieren. Sie können Text auf einer UIView nur in der -drawRect: Methode zeichnen. Hier ist eine Idee für Ihre Unterklasse.

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

Mehr Informationen über NSString s can be found here Zeichnung. Sobald Sie diese Ansicht mit Ihrem Text darauf haben, konvertieren Sie sie in eine UIImage with this technique.

+0

ok, danke. Lass es mich versuchen. – Lazarus

1

Es ist ganz einfach. Sie möchten Text in UIImage konvertieren. Nur draw text view's layer into Image context und in UIImage konvertieren. Code ist unten.

+ (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(); 

Sie können mit diesem

1

Swift Antwort starten

Wenn Sie nur ein, ein Bild des sichtbaren Inhalt eines UIFieldView, UITextView oder UILabel bekommen müssen, dann können Sie die folgende Methode verwenden .

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 
} 

Sonderfall

Wenn der Textinhalt scrollt aus dem Rahmen, wie in einem UITextView, die Lösung oben nur den sichtbaren Bereich erfassen. Um alles zu bekommen, besteht eine Lösung darin, eine Kopie der Textansicht auf die Größe ihrer Inhaltsansicht zu skalieren, bevor ein Bild davon erstellt wird.

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 
} 

Hinweise

  • Man könnte auch die Größe nur die ursprüngliche Text-Ansicht und es dann wieder die Größe zurück. Es schien jedoch einfacher, nur eine temporäre Kopie zu erstellen.
  • Eine andere Möglichkeit, eine Kopie einer Ansicht zu erhalten, ist archive and unarchive it.
  • Oder Sie könnten einfach direkt an eine UIImage schreiben.
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; 

Ich möchte Tabellenansicht präsentieren in so dass ich diesen Code in der Zelle für Zeile an der Indexpfad schreibe.

(dataDict ist mein Wörterbuch, wo ich alle meine Daten erhalten habe).

Verwandte Themen