簡體   English   中英

iOS:抗鋸齒失敗(CALayer 中的 PNG)

[英]iOS: Antialiasing fail (PNG in CALayer)

我正在嘗試在屏幕上繪制此圖像:

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];

這就是我得到的:

渲染失敗

是什么賦予了? 為什么邊緣這么鋸齒? 將此與以完全相同的方式合成到屏幕上的羅馬數字圖像進行對比。

我努力了

            dullLayer.edgeAntialiasingMask = 0x0f; // binary 1111

無濟於事。

編輯: http://lists.apple.com/archives/cocoa-dev/2008/Feb/msg02070.html

如果您發布的結果圖像與屏幕上顯示的大小相同,那么您只是使用了太大的圖像。 PNG 圖像不是矢量圖像,因此將其縮小總是會產生一些鋸齒; 你縮小得越多,情況就越糟。 在這種情況下,抗鋸齒效果有限。

您在數字圖像中看不到它的事實部分是因為它沒有像其他圖像那樣包含任何精細、高對比度的線條,部分原因可能是您為它們使用了較小的圖像。

如果您將原始圖像作為矢量圖像,請在將其轉換為 PNG 之前嘗試將其縮小到正確的大小。 如果您在應用程序的其他地方需要更高分辨率的版本,請考慮創建多個 PNG,每個 PNG 具有不同的分辨率。

如果您沒有將原始圖像作為矢量圖像,則應嘗試尋找替代圖像。 web 上有幾個很好的免費剪貼畫文件來源,例如http://www.openclipart.org/http://www.clker.com

我剛剛發了一個帖子: 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;

戴斯蒙德成功了。

蘋果框架中的抗鋸齒似乎只對相鄰像素起作用。 因此,如果將圖像縮小 4 倍,則像素 0,0 將與像素 2,0 進行平均,即像素 1,0 被完全丟棄。 所以如果你有鋒利的邊緣,這不會破解它。

解決方案是反復將圖像縮小 50%,直到小於所需大小的 2 倍。

如果我逐漸縮小原始 600 x 600 圖像,每次將其減半,並將結果顯示到 256 x 256 CALayer 中,會發生以下情況:

漸進式減少

第三張圖片實際上已經縮小到低於目標尺寸。 奇怪的是,進一步縮小(自動放大 75 -> 256 以便顯示)實際上看起來最好。

所以實際上在這種情況下,解決方案是減小它直到它實際上小於所需的大小,然后讓 Apple 的圖形框架根據需要擴展它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM