2014-05-09 4 views
22

Próbuję napisać funkcję konwersji tekstu pola tekstowego na obraz (example). Próbowałem szukać przykładu, większość próbki również zastępuje tekst na obrazie. Czy mogę podać przykład lub wskazówki, jak to zrobić?Jak przekonwertować tekst na obraz?

+0

Potrzebuję tej funkcji, ponieważ otrzymuję dane z serwera. jeśli dane miały obraz, to UIIMAGEView wyświetli obraz, ale jeśli nie ma obrazu, to muszę przekonwertować część treści na obraz i pokazać na UIIMAGEVIEW. – Lazarus

+0

Spójrz na moje rozwiązanie tutaj. Swift 3: [Konwertowanie tekstu na UIImage iOS] (http://stackoverflow.com/a/43109230/6665075) –

+0

Zobacz [moja odpowiedź Swift 4/iOS 11 na podobne pytanie] (https://stackoverflow.com/a/45821857/1966109), która pokazuje do 6 różnych sposobów konwersji tekstu na obraz (lub widok) w celu jego wyświetlenia. –

Odpowiedz

49

Możliwe są różne podejścia.

  1. Jeśli masz istniejący UITextField, UITextView lub UILabel że po prostu chcesz uczynić jako obraz, można zatrudnić tradycyjne podejścia migawki, takie jak:

    - (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. jeśli chciałeś ogólna procedura "Utwórz obraz z tekstu", w systemie iOS 7 wyglądałaby następująco:

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

    Powyższe stworzy obraz którego rozmiar będzie się różnić w zależności od tekstu. Oczywiście, jeśli potrzebujesz tylko obrazu o stałym rozmiarze, użyj raczej stałych frame, zamiast dynamicznie go budować.

    W każdym razie, można następnie wykorzystać powyższe tak:

    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. Jeśli trzeba wspierać wcześniejsze wersje iOS, można użyć tej techniki:

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

Istnieją wiele, wiele permutacji każdego z nich. To zależy od tego, co próbujesz osiągnąć.


Innym sposobem jest po prostu mają zarówno UIImageView i UILabel/UITextView obiektów w widoku, a jeśli masz obraz z serwera, należy ustawić obraz UIImageView i tekst, ustaw text z następujących UILabel/UITextView.

+0

Dobra odpowiedź! Jeśli chcesz przekonwertować kolorowy tekst na obraz, aby uzyskać coś, co można przyciemnić, np. a UIBarButtonItem, masz dwie opcje: 1) ustawić kolor tinty dla przedmiotu, np .: [buttonItem setTintColor: color]; 2) określ tryb renderowania przed zwróceniem pliku ui, na przykład: return [image imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]; –

+0

@Rob choć jest to bardzo stara odpowiedź ... chciałbym wprowadzić opcję (3) z twojej odpowiedzi. Ale umieszczenie tekstu w lewo wyrównanie. Jak mogę go wyśrodkować? Chcę tylko dwie litery na obrazie. –

+0

Dlaczego nie opcja 2? W takim przypadku masz http://stackoverflow.com/a/477658/1271826. Jeśli tego nie zrobisz, musisz ręcznie obliczyć obwiedni prostokąta, który zajmie linia tekstu, a następnie zrównoważyć "pochodzenie" miejsca, w którym narysujesz odpowiednią ilość. Opcja 2 jest znacznie łatwiejsza. – Rob

3

Możesz spróbować utworzyć własną niestandardową podklasę UIView, rysując na niej NSString (twój tekst), a następnie przekonwertować ją na UIImage. Możesz narysować tekst na metodzie UIView tylko w metodzie -drawRect:. Oto pomysł twojej podklasy.

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

Więcej informacji na temat rysowania NSString s can be found here. Gdy masz już ten widok z tekstem, zamień go na UIImage with this technique.

+0

ok, dziękuję. pozwól mi spróbować. – Lazarus

1

To proste. Chcesz przekonwertować tekst na UIImage. Po prostu draw text view's layer into Image context i przekonwertuj na UIImage. kod jest poniżej.

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

Możesz zacząć od tego

1

Swift odpowiedź

Jeśli trzeba tylko uzyskać obraz widocznej treści UIFieldView, UITextView lub UILabel następnie można użyć następującej metody .

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 
} 

Przypadek

Gdy zwoje zawartości tekstu z ramki, na przykład w UITextView roztwór nad przechwyci tylko widocznego obszaru. Aby uzyskać wszystko, jednym z rozwiązań jest zmiana rozmiaru widoku tekstowego na rozmiar jego widoku treści przed utworzeniem jego obrazu.

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 
} 

Uwagi

  • można było również po prostu zmienić rozmiar oryginalnego widoku tekstowego, a następnie zmienić jego rozmiar powrotem. Jednak wydawało się prostsze po prostu zrobić tymczasową kopię.
  • Innym sposobem uzyskania kopii widoku jest archive and unarchive it.
  • Możesz też napisać bezpośrednio na numer 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; 

chcę przedstawić w widoku tabeli więc piszę ten kod w komórce za rzędzie na ścieżce indeksu.

(dataDict to mój słownik, w którym mam wszystkie moje dane).