目标c在转换为UIImage时丢失了CIImage内存

时间:2016-04-28 17:22:29

标签: ios objective-c memory uiimage ciimage

我有以下代码:

- (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为null。 (见截图)Debugging screenshot during second pass

1 个答案:

答案 0 :(得分:1)

并不是说mainMmage.image没有被正确保存,UIImageView - 与CoreGraphics相关的任何东西 - 使用它的UIImage CGImageCGImage。在我们看到的documentation for which

  

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

所以你想在这里做的是制作一个self.imageView.image支持的UIImage,然后摆脱所有的CoreImage数据分配;将- (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; } 分配给类似

的内容
code : "NetConnection.Call.Failed"
description : "HTTP: Failed"
details : "http://serveuripadress/amfphp/Amfphp"
level : "error"