Ios RenderContext:生成文本模糊的图像

Ios RenderContext:生成文本模糊的图像,ios,cocoa-touch,uikit,Ios,Cocoa Touch,Uikit,我正在使用两个不同的UIImageView和UILabel预渲染合成图像,以加快在大型tableview中的滚动。不幸的是,与同一视图中的其他UILabel相比,主UILabel看起来有点模糊 黑色字母PLoS ONE在UILabel中,它们看起来比单词Medical或Medicine更模糊。“公共图书馆一号”的标志可能同样模糊了,但它没有清晰的文字那么明显。 整个杂志封面是分配给UIButton的单个UIImage 资料来源: 这是我用来画图像的代码。magazineView是一个125 x

我正在使用两个不同的UIImageView和UILabel预渲染合成图像,以加快在大型tableview中的滚动。不幸的是,与同一视图中的其他UILabel相比,主UILabel看起来有点模糊

黑色字母PLoS ONE在UILabel中,它们看起来比单词Medical或Medicine更模糊。“公共图书馆一号”的标志可能同样模糊了,但它没有清晰的文字那么明显。 整个杂志封面是分配给UIButton的单个UIImage

资料来源:

这是我用来画图像的代码。magazineView是一个125 x 151像素的矩形。 我尝试过不同的缩放质量,但这并没有改变任何事情。它不应该这样,因为缩放比例不应该有任何不同。我将此图像分配给的UIButton与magazineView的大小完全相同

    UIGraphicsBeginImageContextWithOptions(magazineView.bounds.size, NO, 0.0);
    [magazineView.layer renderInContext:UIGraphicsGetCurrentContext()];
    [coverImage release];
    coverImage = UIGraphicsGetImageFromCurrentImageContext();
    [coverImage retain];
    UIGraphicsEndImageContext();
知道它为什么模糊吗


当我开始图像上下文并立即渲染到其中时,渲染是在偶数像素上进行的,还是需要手动设置渲染发生的位置?

确保标签坐标为整数值。如果它们不是整数,则会显得模糊。

请确保标签坐标是整数值。如果它们不是整数,它们将显得模糊。

我认为您需要使用CGRectIntegral了解更多信息请参见:

我认为您需要使用CGRectIntegral了解更多信息请参见:和

今天我遇到了同样的问题,当我从UILabel文本生成图像时,我的内容被像素化了

我们使用UIGraphicsBeginImageContextWithOptions来配置绘图环境,以便渲染为接受三个参数的位图:

大小:新位图上下文的大小。这表示UIGraphicsGetImageFromCurrentImageContext函数返回的图像的大小

不透明:指示位图是否不透明的布尔标志。如果不透明参数为“是”,则忽略alpha通道,并将位图视为完全不透明

比例:应用于位图的比例因子。如果指定的值为0.0,则比例因子将设置为设备主屏幕的比例因子

因此,我们应该针对设备显示1x、2x、3x使用适当的比例因子来解决此问题

Swift 5版本:

UIGraphicsBeginImageContextWithOptions(frame.size, true, UIScreen.main.scale)
if let currentContext = UIGraphicsGetCurrentContext() {
    nameLabel.layer.render(in: currentContext)
    let nameImage = UIGraphicsGetImageFromCurrentImageContext()
    return nameImage
}
今天我遇到了同样的问题,当我从UILabel文本生成图像时,我的内容被像素化了

我们使用UIGraphicsBeginImageContextWithOptions来配置绘图环境,以便渲染为接受三个参数的位图:

大小:新位图上下文的大小。这表示UIGraphicsGetImageFromCurrentImageContext函数返回的图像的大小

不透明:指示位图是否不透明的布尔标志。如果不透明参数为“是”,则忽略alpha通道,并将位图视为完全不透明

比例:应用于位图的比例因子。如果指定的值为0.0,则比例因子将设置为设备主屏幕的比例因子

因此,我们应该针对设备显示1x、2x、3x使用适当的比例因子来解决此问题

Swift 5版本:

UIGraphicsBeginImageContextWithOptions(frame.size, true, UIScreen.main.scale)
if let currentContext = UIGraphicsGetCurrentContext() {
    nameLabel.layer.render(in: currentContext)
    let nameImage = UIGraphicsGetImageFromCurrentImageContext()
    return nameImage
}

125×151像素,还是点?如果是后者,那么如果你为视网膜构建并在模拟器中逐像素查看它会怎么样?你觉得文字真的很模糊,或者像素加倍了吗?我注意到模拟器并没有呈现出完美边缘的文字,但在手机上却表现得很好。我不知道这是不是你的情况。@Peter:谢谢你的更正-它是125乘151点,因为我是从视图的frame属性得到的。在视网膜模拟器上看起来真的很好。注意,视网膜Inturbidus的艺术品还没有升级:在设备上和模拟器上都是一样的,至少在普通的iPad上是这样。视网膜文字看起来好多了。。。无法解释两者的区别。你有没有弄明白?在我们的应用程序中,使用size/rect的整数值,我们发现了同样的问题。我们在图像中绘制一个UITextLabel用于缓存,但是在视网膜显示上它是模糊的,就像图像被放大了一样,我想它已经放大了。如果我们将尺寸加倍,则文本太小。结果表明,您需要使用UIGraphicsBeginImageContextWithOptions Size,YES,[UIScreen Main Screen]。缩放;以支持视网膜和非视网膜显示。125×151像素,或点?如果是后者,那么如果你为视网膜构建并在模拟器中逐像素查看它会怎么样?你觉得文字真的很模糊,或者像素加倍了吗?我注意到模拟器并没有呈现出完美边缘的文字,但在手机上却表现得很好。我不知道这是不是你的情况。@Peter:谢谢你的更正-125乘151分,因为我是从t得到的
他看到了视图的框架属性。在视网膜模拟器上看起来真的很好。注意,视网膜Inturbidus的艺术品还没有升级:在设备上和模拟器上都是一样的,至少在普通的iPad上是这样。视网膜文字看起来好多了。。。无法解释两者的区别。你有没有弄明白?在我们的应用程序中,使用size/rect的整数值,我们发现了同样的问题。我们在图像中绘制一个UITextLabel用于缓存,但是在视网膜显示上它是模糊的,就像图像被放大了一样,我想它已经放大了。如果我们将尺寸加倍,则文本太小。结果表明,您需要使用UIGraphicsBeginImageContextWithOptions Size,YES,[UIScreen Main Screen]。缩放;以支持视网膜和非视网膜显示。