2013-03-27 72 views
4

我的UIView爲其圖層使用TBPaperLayer的實例。如何在UIView的layerClass實例上使用CIFilter?

+(Class)layerClass { 
    return [TBPaperLayer class]; 
} 

我想創建一個CIFilter來修改此圖層的外觀 - 特別是對其應用模糊濾鏡。 如何使用此代碼來模糊此圖層的一部分? (從代碼:Blur CALayer's Superlayer

CALayer *blurLayer = [CALayer layer]; 
CIFilter *blur = [CIFilter filterWithName:@"CIGaussianBlur"]; 
[blur setDefaults]; 
blurLayer.backgroundFilters = [NSArray arrayWithObject:blur]; 
[self.superlayer addSublayer:blurLayer]; 

有期間-init沒有superlayer。

+1

請注意,鏈接的解決方案適用於Mac,您可以在其中爲視圖提供核心圖像過濾器一段時間。我不相信你可以在iOS上使用UIViews和CALayers來做到這一點,但我可能在最近的更新中遺漏了一些東西。 – 2013-03-27 21:59:12

回答

10

這在iOS上不可行。從CALayer class reference

特別注意事項

不支持在iOS的層這個屬性。

據推測,蘋果並不認爲目前這一代iOS硬件功能強大到足以支持實時圖像過濾。

1

對於iOS 6.1,我想要一個視圖,它封裝了用於標題序列的某些動態圖形中縮小的內向和去模糊效果。我生成的代碼(並非全部顯示在此)穩步減小了伸展因子(向內縮小文本的水平縮放比例)和模糊量。應用此效果的文本呈現爲UIBezierPath並存儲在self.myPath中。計時器觸發減少兩個值並調用setNeedsDisplay的方法。

- (void)displayLayer:(CALayer *)layer 
{ 
    UIGraphicsBeginImageContext(self.bounds.size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGAffineTransform stretch = CGAffineTransformMakeScale(self.stretchFactor + 1.0, 1.0); 
    CGPathRef stretchedPath = CGPathCreateCopyByTransformingPath([self.myPath CGPath], &stretch); 
    CGRect newBox = CGPathGetBoundingBox(stretchedPath); 
    float deltaX = CGRectGetMidX(self.bounds) - CGRectGetMidX(newBox); 
    float deltaY = CGRectGetMidY(self.bounds) - CGRectGetMidY(newBox); 
    CGAffineTransform slide = CGAffineTransformMakeTranslation(deltaX, deltaY); 
    CGPathRef centeredPath = CGPathCreateCopyByTransformingPath(stretchedPath, &slide); 
    CGPathRelease(stretchedPath); 
    CGContextAddPath(ctx, centeredPath); 
    CGPathRelease(centeredPath); 
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]); 
    CGContextFillPath(ctx); 
    UIImage *tmpImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    CIImage *inputImage = [CIImage imageWithCGImage:[tmpImage CGImage]]; 
    CIFilter *gBlurFilter = [CIFilter filterWithName:@"CIGaussianBlur" 
            keysAndValues:@"inputRadius", [NSNumber numberWithFloat:self.blurFactor], 
               @"inputImage", inputImage, nil]; 
    CIImage *blurredImage = [gBlurFilter outputImage]; 
    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgimg = [context createCGImage:blurredImage fromRect:[blurredImage extent]]; 
    [layer setContents:(__bridge id)cgimg]; 
    CGImageRelease(cgimg); 
} 

- (void)drawRect:(CGRect)rect 
{ 
    // empty drawRect: to get the attention of UIKit 
} 

我還沒有檢查是否有泄漏的代碼,所以認爲這是「僞碼」 :-)如圖所示,這可能已經內的drawRect做到:不使用層,但我有其他的事情怎麼回事在這個濃縮版本中沒有顯示這個觀點。

但由於CIGaussianBlur需要大量的時間,我正在尋找image processing using the Accelerate framework來了解如何讓我的版本更流暢。