2014-04-01 79 views
0

我有一些問題應用過濾器的圖像。使用CIImage時,下面的代碼工作完美:imageWithContentsOfURL:來自NSURL的CGImage工作,但不是從UIImage

NSInteger filterIndex = [(UITapGestureRecognizer *)sender view].tag; 
Filter *filter = [filters objectAtIndex:filterIndex]; 

CIContext *context = [CIContext contextWithOptions:nil]; 

CIImage *image = [CIImage imageWithContentsOfURL:[NSURL URLWithString:@"http://url.to/photo.jpg"]]; 

[filter.filter setValue:image forKey:kCIInputImageKey]; 

CIImage *result = [filter.filter valueForKey:kCIOutputImageKey]; 
CGRect extent = [result extent]; 
CGImageRef cgImage = [context createCGImage:result fromRect:extent]; 

[self.imageView setImage:[UIImage imageWithCGImage:cgImage]]; 

過濾器只是一個模型控股過濾器名稱和CIFilter:

-(id)initWithNameAndFilter:(NSString *)theName filter:(CIFilter *)theFilter; 
@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) CIFilter *filter; 

但是當我嘗試加載與下面的代碼在本地的UIImage:

CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage; 

已過濾的圖像只變白(或消失)。我究竟做錯了什麼?

回答

2

的問題是,

[UIImage imageNamed:@"test.png"].CIImage 

沒有做什麼,你認爲它。它不會將UIImage轉換爲CIImage,或者從UIImage派生CIImage;它僅僅提供了對這個UIImage的基礎的已經是的CIImage的引用。但是這個UIImage沒有一個CIImage的基礎;它是一個位圖(CGImage),而不是過濾器輸出(CIImage)。

這就是爲什麼,正如你已經正確地發現,你有使用不同的方法,CIImage的initWithCGImage:,其中確實執行轉換。 UIImage(正如我剛纔所說)確實有一個CGImage的基礎,所以這個工程。

換句話說,UIImage(大部分)只是一個包裝。它可以是位圖(CGImage)或濾鏡輸出(CIImage)的包裝。而這兩種方法,CGImageCIImage,只是獲得包裝的方式;只有其中一個會在任何給定的UIImage上工作,並且大部分時間將會是CGImage