【问题标题】:The antialias of rotated CGImage/CGlayer seems jaggy, UIImageView's is not旋转的 CGImage/CGlayer 的抗锯齿似乎是锯齿状的,UIImageView 的不是
【发布时间】:2009-12-07 21:05:43
【问题描述】:

我需要用旋转灰度图像掩盖“纹理”图像。

我发现,我必须用 CGImagesCGlayers 来做(如果有更简单的方法只使用 UIImageViews,请让我知道)。

我的问题很简单:

抗锯齿 旋转变换的 CG 东西很安静 锯齿状...

...但是旋转变换的 UIImageView 的抗锯齿效果还算完美。我怎样才能产生漂亮的抗锯齿旋转?

我已经上传了一个涉及实际 iPhone 模拟器屏幕截图的“证明”,看看我在说什么:http://gotoandplay.freeblog.hu/files/Proof.png

我尝试使用 CGImagesCGLayersUIImageViews “捕获”与 renderInContext,我'我尝试将 CGContextSetInterpolationQuality 设置为高,并尝试将 CGContextSetAllowsAntialiasing - CGContextSetShouldAntialias 设置为高,但每种情况都返回相同的锯齿状结果。

我计划明年学习使用 OpenGL,但这个开发应该只使用 CoreGraphics 发布。请让我知道如何获得完美渲染的旋转图像,我不能接受这是不可能的。

【问题讨论】:

  • 嗨,geri,您找到解决此问题的方法了吗?我在这里面临类似的问题:stackoverflow.com/questions/2590470/…
  • 是的。每个解决方案都对性能要求很高,所以我决定学习 OpenGL ES API。没什么大不了的,游戏在抗锯齿和性能方面都变得非常流畅。
  • 看起来像带有抗锯齿图像纹理的旋转锯齿平面。

标签: iphone uiimageview cgimage cglayer


【解决方案1】:

要为您的图像添加 1px 透明边框,请使用此

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext( imageRect.size ); 
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

【讨论】:

    【解决方案2】:

    您是否尝试过在图像周围添加清晰的 1 像素边框?我听说这是一种避免混叠的技巧,通过在混合边缘时为 CoreGraphics 提供一些工作空间。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,看来我也要把它移到 OpenGL ES 上。我无法确定一个不影响性能的有效解决方案。

      作为未来 CoreGraphics 浏览器的参考,放置一个 1 像素的透明边框确实在我的实验中取得了显着的改进,但似乎正如 Eonil 所提到的,您最终会遇到多个阶段的抗锯齿/平滑/插值工作其他。 IE:CGLayer 为它的旋转做一些插值,然后它被绘制到的上下文将做一些插值/抗锯齿,依此类推,直到它看起来很粗糙。

      实际上,通过在目标上下文上禁用插值和抗锯齿,我最终得到了更好的结果,尽管它仍然明显是锯齿状的(尽管总体上工件较少)。通过在构建 CGLayer 时启用插值和抗锯齿,并在重新绘制它时为目标上下文禁用它,我能够获得最佳的整体外观。显然,这种方法充满了其他问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多