2016-04-28 69 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