将 NSString 绘制到 UIImage

Posted

技术标签:

【中文标题】将 NSString 绘制到 UIImage【英文标题】:Drawing NSString to UIImage 【发布时间】:2011-09-08 06:11:19 【问题描述】:

我有一个 NSString 对象。 我想将它写入现有的 UIImage 对象。 UIImage 对象已经有一些与之关联的图像。 我想将字符串写入同一图像。 如何实现?

【问题讨论】:

【参考方案1】:

编辑: 以下是实现编辑 UIImage 并在其上写入文本的基本步骤。

    从 UIImage 中获取 CGImage。 在上下文中渲染 CGImage。 在相同的上下文中呈现您想要编写的文本。 获取上下文位图并从中生成 CGImage。 从 CGImage 中获取 UIImage....

在图像视图上显示文本和标签会更容易。 并且已经有了答案。

然后将其更新为文件或在屏幕上显示....

【讨论】:

【参考方案2】:

NSString 不能成为 UIImage。但是,听起来您想要做的只是在图像上插入一些文本,这很容易实现。

    创建一个UILabel *label。使用label.text = myString; 将文本设置为您的字符串。

    创建一个UIImageView *imageView。使用imageView.image = myimage将视图的图像设置为您的图像。

    UILabel 添加为UIImageView 的子视图(作为UIView 的子类,它需要子视图)和[imageView addSubview:label];(如果您使用的是IB)。

确保将标签的背景设置为[UIColor clearColor] 或设置alpha = 0.0 使其透明。

【讨论】:

【参考方案3】:

您可以将图像和字符串都绘制(合成)到图形上下文中,然后获取生成的 UIImage。

要绘制图像,请使用renderInContext。 要绘制文本,请使用CGContextShowTextAtPoint。 获取结果图像

UIImage *compositeImage = UIGraphicsGetImageFromCurrentImageContext();

【讨论】:

【参考方案4】:

这是我的代码。我有一个 35x480 视图,并在其上绘制旋转 90 度的文本。我希望这有帮助。我画了图像,然后是文本,所以它显示出来。它看起来像一个窗口的窗口标题。

我先绘制图像,然后在 drawRect 上绘制文本。

@synthesize topView;
@synthesize delegate;

- (id)initWithFrame:(CGRect)frame

self = [super initWithFrame:frame];
if (self) 
    // Initialization code
    topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    topView.backgroundColor = [UIColor clearColor];
    topView.opaque = NO;


    
    return self;



// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect

    UIGraphicsBeginImageContext(img.image.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    // draw titleborder
    CGRect titleRect = CGRectMake(0, 0, 35, 480);
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"titleborder" ofType:@"png"];  
    UIImage *titleImage = [[UIImage alloc] initWithContentsOfFile:filePath];
    [titleImage drawInRect:titleRect];
    [self bringSubviewToFront:topView];

    UIFont *font = [UIFont boldSystemFontOfSize:16.0];

    CGRect textRect = CGRectMake(0, rect.size.height/2, 480, 40);
    NSLog(@"text rect frame: %@", NSStringFromCGRect(textRect));

    [self drawText:[[NSString alloc] initWithFormat:@"My Window Title"] rect:textRect context:context font:font red:1.0 green:1.0 blue:1.0 alpha:1.0] ;

    CGContextRestoreGState(context);




- (void) drawText: (NSString *)text rect: (CGRect)rect context:(CGContextRef)context font:(UIFont *)font red:(CGFloat)r green: (CGFloat)g blue:(CGFloat)b alpha:(CGFloat)alpha 
    CGContextSetTextDrawingMode(context, kCGTextFill);

    CGContextSetRGBFillColor(context, r, g, b, alpha); // 6 
    CGContextSetRGBStrokeColor(context, 1, 1, 1, 1);
    CGAffineTransform transform1 = CGAffineTransformMakeRotation(-90.0 * M_PI/180.0);
    CGContextConcatCTM(context, transform1);

    CGSize sizeOfString = [text sizeWithFont:font];
    CGContextTranslateCTM(context, (sizeOfString.width/2) - 420,-232);

    [text drawInRect:rect withFont:font lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentLeft];

【讨论】:

以上是关于将 NSString 绘制到 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - NSString.draw(in: rect, withAttributes:) -- 文本未在预期点绘制

在多个矩形中绘制一个 NSString

我怎样才能获得将在其中绘制子字符串的绑定矩形?

如何将 UIImage 视图和其中的文本保存到磁盘

如何在 UIView 上绘制一个 NSString 数组,它们之间没有任何前导空格并占据整个矩形?

将 NSString 分成几行(以适应所需的宽度)