簡體   English   中英

目標C轉換為UIImage時丟失了CIImage內存

[英]Objective c lost CIImage memory when converting to 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 *(參見圖片)。 調試期間的屏幕截圖

讓我擔心的另一件事是,我注意到緩沖區的大小明顯小於第二遍的緩沖區大小。 這使我相信該圖像未保存。 同樣在第二遍,調試器說* imge為空。 (請參見屏幕截圖) 在第二遍調試屏幕截圖

不是說mainImage.image沒有被正確保存,而是UIImageView與CoreGraphics相關的任何東西-都使用了UIImageCGImage 在我們看到的文檔中

如果使用CIImage對象初始化了UIImage對象,則該屬性的值為NULL。

因此,您要做的就是制作一個由CGImage支持的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM