iOS:抗锯齿失败(CALayer中的PNG)

我试图在屏幕上绘制这个图像:

src_image分别

这是代码:

CALayer* dullLayer = [CALayer layer]; { dullLayer.frame = CGRectMake(0,0,BUTTON_SIZE,BUTTON_SIZE); dullLayer.position = CGPointFromPoint2D( btnCenter ); dullLayer.opacity = topQuadrant ? 1.0 : 0.5; [wheelLayer addSublayer: dullLayer]; } UIImage* test = [UIImage imageNamed: @"OuterButton_Dull.png"]; dullLayer.contents = (id) [test CGImage]; 

这是我得到的:

render_fail

是什么赋予了? 为什么边缘如此锯齿? 将其与用完全相同的方式合成的罗马数字图像进行对比。

我努力了

  dullLayer.edgeAntialiasingMask = 0x0f; // binary 1111 

无济于事。

编辑: http : //lists.apple.com/archives/cocoa-dev/2008/Feb/msg02070.html

如果您发布的结果图像与屏幕上显示的图像大小相同,那么您只是使用了太大的图像。 一个PNG图像不是一个vector图像,所以缩小它总是会给一些别名; 越缩小越差。 在这种情况下,抗锯齿效果将会受到限制。

事实上,你没有看到它的数字图像,部分原因是它不包含任何罚款,高对比度,像其他图像行,部分也许是因为你正在使用较小的图像。

如果将原始图像作为vector图像,请在将其转换为PNG之前将其缩小到合适的大小。 如果您的应用需要更高分辨率的版本,请考虑创build多个PNG,每个PNG的分辨率不同。

如果您没有将原始图像作为vector图像,则应尝试findreplace图像。 网上有免费的剪贴画文件的好几个来源,如http://www.openclipart.org/或http://www.clker.com/

我只是做了一个post: http : //kellenstyler.com/?p=1360

如果您通过代码添加图片以及一些可以让您清理更多的技巧,您可以执行一些操作。

看下面的代码是否有帮助:

 UIImage * img =[UIImage imageWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent:@"AliasImage.png" ] ] ]; CGRect imageRect = CGRectMake( 0 , 0 , img.size.width + 4 , img.size.height + 4 ); UIGraphicsBeginImageContext( imageRect.size ); [img drawInRect:CGRectMake( imageRect.origin.x + 2 , imageRect.origin.y + 2 , imageRect.size.width - 4 , imageRect.size.height - 4 ) ]; CGContextSetInterpolationQuality( UIGraphicsGetCurrentContext() , kCGInterpolationHigh ); img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [aliasImage setImage:img ]; aliasImage.transform = CGAffineTransformScale(aliasImage.transform , 0.45 , 0.45 ); aliasImage.layer.shouldRasterize = YES; aliasImage.layer.rasterizationScale = 0.45; aliasImage.layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge; aliasImage.clipsToBounds = NO; aliasImage.layer.masksToBounds = NO; 

德斯蒙德钉了它。

看来苹果框架中的抗锯齿只能在相邻像素上运行。 所以如果你减less4倍的图像,像素0,0将被平均对像素2,0,即像素1,0被完全丢弃。 所以如果你有尖锐的边缘,这是不会破解它。

解决办法是重复将图像缩小50%,直到它小于所需尺寸的2倍。

以下是如果逐步缩小原始600 x 600图像,每次减半,并将结果显示到256 x 256 CALayer的情况:

progressive_reduction

第三张图片实际上缩小到了目标尺寸以下。 奇怪的是,进一步的缩小(自动放大到75-> 256以便显示)实际上看起来是最好的。

所以实际上在这种情况下,解决scheme是减less它,直到它实际上小于所需的大小,然后让苹果的graphics框架根据需要扩大它。