2011-08-14 50 views
4

我試圖在屏幕上繪製此圖像:的iOS:抗鋸齒失敗(PNG中的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]; 

這是我得到:

render_fail

什麼給?爲什麼邊緣如此鋸齒狀?將這與羅馬數字圖像進行對比,這些圖像以完全相同的方式合成爲進行屏幕顯示。

我已經試過

  dullLayer.edgeAntialiasingMask = 0x0f; // binary 1111 

無濟於事。

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

回答

6

如果您發佈的結果圖像的大小相同,因爲它出現在屏幕,那麼你只需使用過大的圖像。一個PNG圖像不是一個矢量圖像,所以縮小它總是會給一些別名;你進一步縮小了它越糟糕。在這種情況下,抗鋸齒效果將會受到限制。

事實上,你沒有看到它的數字圖像,部分原因是它不包含任何罰款,高對比度,行像其他圖像一樣,部分也許是因爲你正在使用較小的圖像。

如果您將原始圖像作爲矢量圖像,請在將其轉換爲PNG之前將其縮小到合適的尺寸。如果您的應用需要更高分辨率的版本,請考慮創建多個PNG,每個PNG的分辨率不同。

如果你沒有原始圖像作爲矢量圖像,你應該嘗試找到替換。在網絡上有免費剪貼畫文件的好幾個好來源,例如http://www.openclipart.org/http://www.clker.com/

+0

謝謝!這正是發生的情況。我會在下面發表一個完整的答案。 –

+1

PS是的數字是*很*小圖像 –

2

德斯蒙德釘了它。

似乎蘋果框架中的抗鋸齒僅對相鄰像素進行操作。所以如果將圖像縮小4倍,像素0,0將對像素2,0進行平均,即像素1,0將被完全丟棄。所以如果你有尖銳的邊緣,這不會破解它。

解決方法是重複將圖像縮小50%,直到它變爲所需尺寸的<。

這裏是如果我逐漸降低原有的600 x 600的圖像,每次減半它,並顯示結果爲256×256的CALayer會發生什麼:

progressive_reduction

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

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

4

我只是做了這樣一個帖子: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;