2012-06-29 2 views
1

Есть ли способ нарисовать текст в с субпиксельным сглаживанием? Текст нарисован на непрозрачном белом фоне, и я попытался использовать функцию CGContextSetShouldSmoothFonts, но это, похоже, не помогает.Подпиксельное сглаживание в NSBitmapImageRep

NSBitmapImageRep *bm = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:300 pixelsHigh:300 bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:0 bitsPerPixel:0]; 
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bm]]; 
[[NSColor whiteColor] set]; 
NSRectFill(NSMakeRect(0, 0, 300, 300)); 
CGContextRef ctx = NSGraphicsContext.currentContext.graphicsPort; 
CGContextSetShouldSmoothFonts(ctx, true); 
[@"Example" drawAtPoint:NSZeroPoint withAttributes:nil]; 
[[bm TIFFRepresentation] writeToFile:[@"~/Desktop/bitmap.tiff" stringByExpandingTildeInPath] atomically:NO]; 

я могу получить текст разглаживанию работать, когда я рисую в NSImage с использованием -[NSImage lockFocus], но это не является надежным при его запуске на дисплее Retina.

ответ

2

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

CGColorSpaceRef cs = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
CGContextRef c = CGBitmapContextCreate(NULL, 300, 300, 8, 300 * 4, cs, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little); 
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:c flipped:NO]]; 
[[NSColor whiteColor] set]; 
NSRectFill(NSMakeRect(0, 0, 300, 300)); 
[@"Example" drawAtPoint:NSZeroPoint withAttributes:nil]; 
CGImageRef cgImage = CGBitmapContextCreateImage(c); 
NSImage *im = [[NSImage alloc] initWithCGImage:cgImage size:NSZeroSize]; 
[[im TIFFRepresentation] writeToFile:[@"~/Desktop/cgImage.tiff" stringByExpandingTildeInPath] atomically:NO]; 
CGImageRelease(cgImage); 
CGColorSpaceRelease(cs); 
CGContextRelease(c); 
Смежные вопросы