2016-11-17 42 views
1

我已创建此类别以将CIImage转换为UIImage。我使用的CIImage来自CIFilter s。CIImage大小范围零?

-(UIImage *)obtainImageWithRetinaScale:(CGFloat)scale 
{ 
    CIContext *context = [CIContext contextWithOptions:nil]; 

    //CGRect frame = CGRectMake(0,0,700,392); 
    CGImageRef processedCGImage = [context createCGImage:self 
               fromRect:[self extent]]; 

    UIImage *returnImage = [UIImage imageWithCGImage:processedCGImage 
            scale:scale 
           orientation:UIImageOrientationUp]; 
    CGImageRelease(processedCGImage); 

    return returnImage; 
} 

在运行此,[self extent]给人以乱码数字的矩形,是勉强(0,0,无穷大,无穷)......真的很庞大的数字在那里。

显然处理的图像是零。

当我强制正确尺寸的框架时,图像被正确生成。

+0

您是否编写自己的内核? http://benbritten.com/2008/07/24/cifilter-infinite-extent-problems/ – HAS

+0

或者这有帮助吗? http://stackoverflow.com/a/21787766/1489885 – HAS

回答

1

使用下面的代码,学分完全去William Vasconcelos在他的回答here这就是为什么我提出这个社区的wiki:

//assume beginImage is CIImage you want to tint    
CIImage* outputImage = nil; 

//create some blue 
CIFilter* blueGenerator = [CIFilter filterWithName:@"CIConstantColorGenerator"]; 
CIColor* blue = [CIColor colorWithString:@"0.1 0.5 0.8 1.0"]; 
[blueGenerator setValue:blue forKey:@"inputColor"]; 
CIImage* blueImage = [blueGenerator valueForKey:@"outputImage"]; 

//apply a multiply filter 
CIFilter* filterm = [CIFilter filterWithName:@"CIMultiplyCompositing"]; 
[filterm setValue:blueImage forKey:@"inputImage"]; 
[filterm setValue:beginImage forKey:@"inputBackgroundImage"]; 
outputImage = [filterm valueForKey:@"outputImage"]; 

要带来一些个人的贡献,使值得的答案,这里是Swift 3版本:

// assume beginImage is the CIImage you want to tint 
let outputImage: CIImage? 
let blueGenerator = CIFilter(name: "CIConstantColorGenerator", withInputParameters: ["inputColor": CIColor(string: "0.1 0.5 0.8 1.0")]) 
let blueImage = blueGenerator!.outputImage 

let filterM = CIFilter(name: "CIMultiplyCompositing", withInputParameters: ["inputImage": blueImage, "inputBackgroundImage": beginImage]) 
outputImage = filterM.outputImage