将 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:) -- 文本未在预期点绘制