![](/img/trans.png)
[英]Is there any way to convert CIImage to NSData without converting CIImage to UIImage or CGImage?
[英]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相關的任何東西-都使用了UIImage
的CGImage
。 在我們看到的文檔中
如果使用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.