2016-04-28 77 views
0

我有以下代码时丢失CIImage存储器:目标C转换成的UIImage

- (void)applySepiaFilter { 
    // Set previous image 
    NSData *buffer = [NSKeyedArchiver archivedDataWithRootObject: self.mainImage.image]; 
    [_images push:[NSKeyedUnarchiver unarchiveObjectWithData: buffer]]; 

    [_images push:[NSKeyedUnarchiver unarchiveObjectWithData: buffer]]; 


    UIImage* u = [_images pop]; 
    CIImage *image = [[CIImage alloc] initWithCGImage:u.CGImage];//[CIImage imageWithContentsOfURL:fileNameAndPath]; 
    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
            keysAndValues: kCIInputImageKey, image, 
         @"inputIntensity", @0.8, nil]; 
    CIImage *outputImage = [filter outputImage]; 
    //UIImage *newImage = 
    self.mainImage.image = [UIImage imageWithCIImage:outputImage]; 
} 

凡_images是堆栈:

#import "Stack.h" 

@implementation Stack{ 
    NSMutableArray *stack; 
} 

-(id)init{ 
    self = [super init]; 
    if(self!=nil){ 
     stack = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

-(void)push:(id)obj{ 
    [stack addObject:obj]; 
} 

-(id)pop{ 
    id lastObj = [stack lastObject]; 
    if (stack.count > 1) { 
     [stack removeLastObject]; 
    } 
    return lastObj; 
} 

-(NSUInteger)size{ 
    return stack.count; 
} 

@end 

和self.mainImage是一个的UIImageView。

我第一次运行该方法,我得到所需的棕褐色过滤器。我相信它不正确地保存self.mainImage.image,因为如果我在一行中运行该方法两次,我得到一个self.mainImage.image的空白图像,如果我第三次运行它,我得到一个SIGABRT错误。 我添加了一个断点并开始浏览代码。我注意到在方法的第一遍结束时,self.mainImage.image是一个CIImage *。这让我感到困惑,因为它应该是一个UIImage *(见图)。 Screenshot during debug

另一件令我担心的事情是我注意到缓冲区的大小明显小于它应该在第二遍时的大小。这让我相信图像没有被保存。同样在第二遍时,调试器说* imge为空。 (见截图)Debugging screenshot during second pass

+0

从 – dan

回答

1

这并不是说mainImage.image没有被正确保存,那就是UIImageView - 作为与CoreGraphics中任何东西 - 利用其UIImageCGImage。在documentation for which我们看到

如果UIImage对象是使用CIImage对象初始化,该属性的值为NULL。

所以,你要怎么做这里制作CGImage -backed的UIImage,然后摆脱所有CoreImage数据分配的;分配self.imageView.image为类似

- (UIImage *)imageFromCIImage:(CIImage *)ciImage { 
    CIContext *ciContext = [CIContext contextWithOptions:nil];  
    CGImageRef cgImage = [ciContext createCGImage:ciImage fromRect:[ciImage extent]]; 
    UIImage *image = [UIImage imageWithCGImage:cgImage]; 
    CGImageRelease(cgImage); 
    return image; 
} 
+0

将图像转换回'CGImage'并创建'UIImage'不要做在主线程这种转换,它的成本时间的LOF。 – Itachi