编辑:我误读了问题,并假设您想要Cocoa-touch代码(如果是这样,我将在末尾保留它)。以下是使用CoreText在Cocoa中完成此操作的一种方法(正如其他帖子所述,还有许多其他方法):
{
NSString* string = @"Kevin";
CGFloat fontSize = 12.0f;
CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica Light"), fontSize, nil);
NSDictionary* attributes = [NSDictionary dictionaryWithObjectsAndKeys:
(id)font, kCTFontAttributeName,
nil];
NSAttributedString* as = [[NSAttributedString alloc] initWithString:string attributes:attributes];
CFRelease(font);
CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)as);
CGFloat ascent, descent, leading;
double fWidth = CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
size_t width = (size_t)ceilf(fWidth);
size_t height = (size_t)ceilf(ascent + descent);
void* data = malloc(width*height*4);
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast;
CGContextRef ctx = CGBitmapContextCreate(data, width, height, 8, width*4, space, bitmapInfo);
CGColorSpaceRelease(space);
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, CGRectMake(0.0, 0.0, width, height));
CGFloat x = 0.0;
CGFloat y = descent;
CGContextSetTextPosition(ctx, x, y);
CTLineDraw(line, ctx);
CFRelease(line);
CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef];
NSAssert(imageRep, @"imageRep must not be nil");
NSData* imageData = [imageRep representationUsingType:NSJPEGFileType properties:nil];
NSString* fileName = [NSString stringWithFormat:@"Kevin.jpg"];
NSString* fileDirectory = NSHomeDirectory();
NSString* filePath = [fileDirectory stringByAppendingPathComponent:fileName];
[imageData writeToFile:filePath atomically:YES];
[imageRep release];
CGImageRelease(imageRef);
free(data);
}
这是Cocoa Touch版本:
NSString* kevin = @"Kevin";
UIFont* font = [UIFont systemFontOfSize:12.0f];
CGSize size = [kevin sizeWithFont:font];
UIGraphicsBeginImageContext(size);
[kevin drawAtPoint:CGPointMake(0.0, 0.0) withFont:font];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
NSData* data = UIImageJPEGRepresentation(image, 1.0);
NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *docDir = [arrayPaths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"Kevin.jpg"];
BOOL success = [data writeToFile:filePath atomically:YES];
if(!success)
{
NSLog(@"Failed to write to file. Perhaps it already exists?");
}
else
{
NSLog(@"JPEG file successfully written to %@", filePath);
}
UIGraphicsEndImageContext();
当我开始学习iOS编程时,我发现以下几点很不直观或者不寻常。测量和绘制字符串的方法是在
NSString
上而不是像其他系统一样在图形上下文中。保存数据的方法是在
NSData
上而不是文件类!创建图形上下文的函数是普通的C函数而不是任何类的一部分。
希望这能有所帮助!
ScriptItemize
->ScriptShape
->ScriptPlace
-> 等等)需要编写大约3倍的代码才能实现与Cocoa相同的功能。(虽然GDI不是最新的API,但仍然如此。) - Dietrich Epp