CGContextShowTextAtPoint在Retina设备上产生非Retina输出
我试图添加一个文本到UIImage
,我得到一个像素化的绘图。
我尝试了一些其他的答案没有成功:
- 使用CoreGraphics绘制视网膜显示 – 图像像素化
- 视网膜显示核心graphics的字体质量
- 用Core Graphics绘图在Retina显示屏上看起来矮胖
我的代码:
-(UIImage *)addText:(UIImage *)imgV text:(NSString *)text1 { int w = self.frame.size.width * 2; int h = self.frame.size.height * 2; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate (NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); CGContextDrawImage(context, CGRectMake(0, 0, w, h), imgV.CGImage); CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1); char* text = (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding]; CGContextSelectFont(context, "Arial", 24, kCGEncodingMacRoman); // Adjust text; CGContextSetTextDrawingMode(context, kCGTextInvisible); CGContextShowTextAtPoint(context, 0, 0, text, strlen(text)); CGPoint pt = CGContextGetTextPosition(context); float posx = (w/2 - pt.x)/2.0; float posy = 54.0; CGContextSetTextDrawingMode(context, kCGTextFill); CGContextSetRGBFillColor(context, 255, 255, 255, 1.0); CGContextShowTextAtPoint(context, posx, posy, text, strlen(text)); CGImageRef imageMasked = CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); return [UIImage imageWithCGImage:imageMasked]; }
像Peter说的那样,使用UIGraphicsBeginImageContextWithOptions
。 您可能想要将image.scale传递给scale属性(其中image.scale是您正在绘制的某个图像的比例),或者只需使用[UIScreen mainScreen] .scale。
这个代码可以做得更简单。 尝试像这样:
// Create the image context UIGraphicsBeginImageContextWithOptions(_baseImage.size, NO, _baseImage.scale); // Draw the image CGRect rect = CGRectMake(0, 0, _baseImage.size.width, _baseImage.size.height); [_baseImage drawInRect:rect]; // Get a vertically centered rect for the text drawing rect.origin.y = (rect.size.height - FONT_SIZE) / 2 - 2; rect = CGRectIntegral(rect); rect.size.height = FONT_SIZE; // Draw the text UIFont *font = [UIFont boldSystemFontOfSize:FONT_SIZE]; [[UIColor whiteColor] set]; [text drawInRect:rect withFont:font lineBreakMode:NSLineBreakByClipping alignment:NSTextAlignmentCenter]; // Get and return the new image UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image;
其中text
是一个NSString对象。
我面对的是同样的问题,昨天晚上没有人回答。 我在下面的问题中将fnf的build议更改与Clif Viegas的回答结合在一起: CGContextDrawImage在通过UIImage.CGImage时颠倒绘制图像
拿出解决scheme。 我的addText方法与你的稍有不同:
+(UIImage *)addTextToImage:(UIImage *)img text:(NSString *)text1 {
int w = img.size.width; int h = img.size.height; CGSize size = CGSizeMake(w, h); if (UIGraphicsBeginImageContextWithOptions != NULL) { UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); } else { UIGraphicsBeginImageContext(size); } CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(context, 0,h); CGContextScaleCTM(context, 1.0, -1.0); 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, "Times New Roman", 14, kCGEncodingMacRoman); CGContextSetTextDrawingMode(context, kCGTextFill); CGContextSetRGBFillColor(context, 0, 0, 0, 1); //rotate text CGContextSetTextMatrix(context, CGAffineTransformMakeRotation( -M_PI/8 )); CGContextShowTextAtPoint(context, 70, 88, text, strlen(text)); CGColorSpaceRelease(colorSpace);
UIGraphicsEndImageContext();
返回newImg;
}
总之,我所做的是添加
if (UIGraphicsBeginImageContextWithOptions != NULL) { UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); } else { UIGraphicsBeginImageContext(size); }
去掉
// CGContextRef context = CGBitmapContextCreate(NULL,w,h,8,4 * w,colorSpace,kCGImageAlphaPremultipliedFirst);
并放
CGContextRef context = UIGraphicsGetCurrentContext();
代替。 但这会导致图像颠倒。 所以我把
CGContextTranslateCTM(context, 0,h); CGContextScaleCTM(context, 1.0, -1.0);
就在CGContextDrawImage(context,CGRectMake(0,0,w,h),img.CGImage)之前;
这样你可以使用CG函数而不是使用drawInRect等。
别忘了
UIGraphicsEndImageContext
最后。 希望这可以帮助。