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

最后。 希望这可以帮助。