Objective c 将文本放在图像和文本上是模糊的?

Objective c 将文本放在图像和文本上是模糊的?,objective-c,uiimage,Objective C,Uiimage,我正在使用answer将文本放在我的UIImage(方法2)上。问题是,文本非常模糊,而且没有水平和垂直居中。以下是该行为的屏幕截图: 我怎样才能解决这个问题 我要在其中添加文本的代码如下: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueRe

我正在使用answer将文本放在我的
UIImage
(方法2)上。问题是,文本非常模糊,而且没有水平和垂直居中。以下是该行为的屏幕截图:

我怎样才能解决这个问题

我要在其中添加文本的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];
    }

    NSString *metaScore =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"metaScore"]);
    NSString *title = _getString([[news objectAtIndex:indexPath.row] objectForKey:@"title"]);
    NSString *releaseDate =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"releaseDate"]);
    NSString *type =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"type"]);
    NSString *rating =  _getString([[news objectAtIndex:indexPath.row] objectForKey:@"rating"]);

    [cell.textLabel setLineBreakMode:NSLineBreakByWordWrapping];
    cell.textLabel.text = title;
    cell.detailTextLabel.numberOfLines = 4;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@\n%@\n%@", releaseDate, type, rating];

    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.frame = CGRectMake(0, 0, 50, 50);

    imageView.image = [self addText:[UIImage imageNamed:@"green.png"] text:metaScore];
    cell.image = imageView.image;

    [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];

    return cell;
}

-(UIImage *)addText:(UIImage *)img text:(NSString *)text1{
    int w = img.size.width;
    int h = img.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);

    char* text= (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding];
    CGContextSelectFont(context, "Arial", 20, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode(context, kCGTextFill);
    CGContextSetRGBFillColor(context, 256, 256, 256, 1);
    CGContextShowTextAtPoint(context, 20, 20, text, strlen(text));
    CGImageRef imgCombined = CGBitmapContextCreateImage(context);

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    UIImage *retImage = [UIImage imageWithCGImage:imgCombined];
    CGImageRelease(imgCombined);

    return retImage;
}

您可能没有在像素对齐的边界上绘制文本

例如,如果将文本定位在
x:12.4,y:18.7
,则文本不会呈现清晰,因为它们没有与屏幕上的像素对齐。对于标准显示,位置和大小必须是整数(不能是分数)。对于视网膜显示,你可以通过拥有半个点来摆脱,但通常也更容易将它们保持为整数

如果使用
CGRect
确定文本的位置,则可以使用
CGRectIntegral()
将它们对齐。这将地板的位置,和天花板的大小。例如:

CGRect position = CGRectMake(12.2, 17.8, 44.7, 49.2);
position = CGRectIntegral(position);
/* Position is now
   x: 12, y: 17
   w: 45, h: 50
*/
如果没有CGRect,可以使用
floor/floorf
ceil/ceilf
(如果使用
cfloats
,则使用
f
变量)

编辑:请记住CoreGraphics使用像素而不是点,因此在任何计算中都需要考虑比例因子。谢天谢地,CoreGraphics让这比你想象的要容易一些。只需在创建上下文后直接插入此。这将为该上下文中的任何未来计算设置正确的比例

CGFloat scale = [[UIScreen mainScreen] scale];
CGContextScaleCTM(context, scale, scale);

至于文本对齐,这并不容易。您将手动将其设置为(20,20),这将设置第一个字符左上角的位置。这不太可能使文本居中。由于您不知道文本的渲染宽度和高度,因此无法补偿左上角的位置以使文本居中。您将在这里遇到困难,但一旦您能够找到文本的渲染宽度和高度,您就可以使用该宽度和图像的宽度/高度来计算正确的位置。

您可能没有在像素对齐的边界上绘制文本

例如,如果将文本定位在
x:12.4,y:18.7
,则文本不会呈现清晰,因为它们没有与屏幕上的像素对齐。对于标准显示,位置和大小必须是整数(不能是分数)。对于视网膜显示,你可以通过拥有半个点来摆脱,但通常也更容易将它们保持为整数

如果使用
CGRect
确定文本的位置,则可以使用
CGRectIntegral()
将它们对齐。这将地板的位置,和天花板的大小。例如:

CGRect position = CGRectMake(12.2, 17.8, 44.7, 49.2);
position = CGRectIntegral(position);
/* Position is now
   x: 12, y: 17
   w: 45, h: 50
*/
如果没有CGRect,可以使用
floor/floorf
ceil/ceilf
(如果使用
cfloats
,则使用
f
变量)

编辑:请记住CoreGraphics使用像素而不是点,因此在任何计算中都需要考虑比例因子。谢天谢地,CoreGraphics让这比你想象的要容易一些。只需在创建上下文后直接插入此。这将为该上下文中的任何未来计算设置正确的比例

CGFloat scale = [[UIScreen mainScreen] scale];
CGContextScaleCTM(context, scale, scale);

至于文本对齐,这并不容易。您将手动将其设置为(20,20),这将设置第一个字符左上角的位置。这不太可能使文本居中。由于您不知道文本的渲染宽度和高度,因此无法补偿左上角的位置以使文本居中。您将在这里遇到困难,但一旦您能够找到文本的渲染宽度和高度,您就可以使用此值和图像的宽度/高度来计算正确的位置。

您必须对水平/垂直滚动进行计算,图像本身看起来分辨率很低,这看起来与该分辨率下的文本一样好。。。在更大的图像上渲染?因为可能文本的宽度和/或高度是奇数,中心点可能是分数像素,而不是整像素…这个答案有点模棱两可。你能发布一些真实的代码吗?图像必须是50px乘50px。我正在uitableviewcell上渲染它。你必须对水平/垂直滚动进行计算,图像本身看起来分辨率很低,这看起来就像文本在该分辨率下一样好。。。在更大的图像上渲染?因为可能文本的宽度和/或高度是奇数,中心点可能是分数像素,而不是整像素…这个答案有点模棱两可。你能发布一些真实的代码吗?图像必须是50px乘50px。我正在uitableviewcell上渲染它。使用您的代码示例,这是我得到的UIImage:但在视网膜设备上查看时,会出现模糊。要解决这个问题,您需要考虑屏幕的比例因子。我会更新我的答案,所以我把它放在
CGContextRef context=CGBitmapContextCreate(NULL,w,h,8,4*w,colorSpace,kcgimagealphapremultipledfirst)后面?它仍然很模糊。使用你的代码示例,这是我得到的UIImage:但是当在视网膜设备上观看时,你会得到模糊度。要解决这个问题,您需要考虑屏幕的比例因子。我会更新我的答案,所以我把它放在
CGContextRef context=CGBitmapContextCreate(NULL,w,h,8,4*w,colorSpace,kcgimagealphapremultipledfirst)后面?还是很模糊。