2014-10-21 2 views
1

В моем приложении я пытаюсь добавить текст на изображение. Я сделал это, используя сообщение в stackoverflow. Это похоже на следующее.Как написать текст на картинке iOS?

+(UIImage *)addText:(UIImage *)img text:(NSString *)text1{ 
    int w = img.size.width; 
    int h = img.size.height; 
    //lon = h - lon; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); 

    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage); 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1); 

    char* text = (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding];// "05/05/09"; 
    CGContextSelectFont(context, "Arial", 18, kCGEncodingMacRoman); 
    CGContextSetTextDrawingMode(context, kCGTextFill); 
    CGContextSetRGBFillColor(context, 255, 255, 255, 1); 


    //rotate text 
    CGContextSetTextMatrix(context, CGAffineTransformMakeRotation(-M_PI/4)); 

    CGContextShowTextAtPoint(context, 4, 52, text, strlen(text)); 


    CGImageRef imageMasked = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    return [UIImage imageWithCGImage:imageMasked]; 
} 

Когда я пишу текст, используя этот код, цвет исходного изображения изменяется, как в следующем,

Исходное изображение

enter image description here

Выход с текстом

enter image description here

Может ли кто-нибудь объяснить, почему это происходит. и как это исправить?

Спасибо заранее!

+2

может быть, вы можете просто программно вставить UILabel на UIImage, если вы не можете найти ответ на свой вопрос. –

+2

Нет причин прибегать к возможно дорогостоящему графическому коду. Просто поставьте надпись и сделайте это. – DBoyer

+0

@DBoyer Существует веская причина - если OP фактически хочет создать новое изображение с текстом на нем. – rmaddy

ответ

1

EDIT: Это может быть запущена только в главном потоке! Так что это бесполезно.

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

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

Вот новый один с помощью Core Graphics, который может быть использован на любом потоке

+ (UIImage *)imageFromView:(UIView *)view 
{ 
    size_t width = view.bounds.size.width*2; 
    size_t height = view.bounds.size.height*2; 

    unsigned char *imageBuffer = (unsigned char *)malloc(width*height*8); 
    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef imageContext = CGBitmapContextCreate(imageBuffer, width, height, 8, width*4, colourSpace,kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big); 

    CGColorSpaceRelease(colourSpace); 

    CGContextTranslateCTM(imageContext, 0.0, height); 
    CGContextScaleCTM(imageContext, 2.0, -2.0); 

    [view.layer renderInContext:imageContext]; 

    CGImageRef outputImage = CGBitmapContextCreateImage(imageContext); 
    UIImage *image = [[UIImage alloc] initWithCGImage:outputImage]; 

    CGImageRelease(outputImage); 
    CGContextRelease(imageContext); 
    free(imageBuffer); 

    return image; 
} 
+0

Где текст? – testing

+0

нет текста ... проблема заключалась в том, что цвета изображений искажались при добавлении текста, этот код позволял выводить изображение на изображение, с помощью которого вы можете добавить 'UILalbel' в' UIImageView' – Magoo

+0

Переопределение Я думаю, что запрет на 'UIImageView' – Magoo

2

Нам нужно создать контекст изображения и применить чертеж и получить окончательное изображение из этого контекста. Вы можете попробовать этот метод. Надеюсь, это поможет вам.

+ (UIImage *) addText:(UIImage *)img text:(NSString *)text 
{ 
    CGRect rect = [[UIScreen mainScreen] bounds]; 

    // create a context according to image size 
    UIGraphicsBeginImageContext(rect.size); 

    // draw image 
    [img drawInRect:rect]; 


    UIFont* font = [UIFont systemFontOfSize:14.0]; 

    /// Make a copy of the default paragraph style 
    NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
    /// Set line break mode 
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; 
    /// Set text alignment 
    paragraphStyle.alignment = NSTextAlignmentCenter; 

    NSDictionary *attributes = @{ NSFontAttributeName: font, 
            NSParagraphStyleAttributeName: paragraphStyle }; 

    CGRect textRect = CGRectMake(20, 160.0, 280.0, 44); 

    /// draw text 
    [text drawInRect:textRect withAttributes:attributes]; 

    // get as image 
    UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
+0

Почему «rect» зависит от размера экрана, а не от размера исходного изображения? – rmaddy

+0

Да, вы можете создать контекст изображения как размер изображения. UIGraphicsBeginImageContext (img.size); –

+0

спасибо. отлично работает – Piyush

1

Я использую это и она отлично работает для меня

- (UIImage*) drawText:(NSString*) text 
     inImage:(UIImage*) image 
     atPoint:(CGPoint) point 
{ 

    UIFont *font = [UIFont fontWithName:FONT_BOLD size:20]; 

    UIGraphicsBeginImageContext(image.size); 

    [image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)]; 

    CGRect rect = CGRectMake(point.x, point.y, image.size.width, image.size.height); 

    [UIColorFromRGB(0x515151) set]; 

    [text drawInRect:CGRectIntegral(rect) withFont:font]; 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return newImage; 
} 
+0

КАК ПОЛЬЗОВАТЬСЯ ДАННЫМ КОДОМ .. –

+0

Что вы имеете в виду, как пользоваться этим кодом? – ColdSteel

+0

, пожалуйста, объясните этот код, как реализовать это время разработки кода. Добавьте мне пример, например, этот код –

Смежные вопросы