蘋果開發 筆記(48) UIImage CIImage CGImageRef
UIImage 有很多有用的東西,前段時間接觸了coreImage的API,發現有一個CIImage的東西,同樣還有一個CGImage的東西,這三者總是可以切換起來,多少讓人覺得這個東西很能耐。 IOS程式設計揭祕 書中記錄著如下一段話。
UIImage類的Core Graphics 版本是CGImage(CGImageRef)這兩個類之間很容易進行轉換,因為一個UIImage類有一個CGImage的屬性“
1.建立過程
UIImage 常規建立過程
UIImage *image =[ UIImage imageNamed:@"xx.png"];
- 1
CGmage的建立過程
CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage ,CGRectMake(0,0,size.width,size.height));
- 1
或者
UIImage *image =[ UIImage imageNamed:@"xx.png"];CGImageRef imageRef = [image CGImage];
- 1
- 2
CIImage的建立過程
NSString *path = [[NSBundle mainBundle] pathForResource:@"bbg" ofType:@"jpg"]; NSURL *myURL = [NSURL fileURLWithPath:path]; CIImage *ciImage = [CIImage imageWithContentsOfURL:myURL];
- 1
- 2
- 3
- 4
2.相互轉換
UIImage, CGImageRef, CIImage 三者之間可以通過一些聯絡進行轉換
2.1 UIImage 轉換CGImageRef
UIImage 類當中包含了CGImage的屬性,所以很方便地就能轉換,方法如下
UIImage *image =[ UIImage imageNamed:@"xx.png"];CGImageRef imageRef = [image CGImage];
- 1
- 2
2.2 CGImageRef 轉換UIImage
UIImage裡面包含了一個方法imageWithCGImage,如果知道了CGImage,則這樣子也可以建立得到UIIamge類,在上面我們可以看到關係 UIImage 通過屬性得到CGImageRef,同樣地兩者也可以關聯起來。
UIImage—>CGImageRef CGImageRef –> UIImage
UIImage *uiImage =[UIImage imageWithCGImage:cgImage];
- 1
2.3 CIImage 轉換CGImageRef
CIContext 當中有一個方法createCGImage,可以建立得到CGImageRef,換句話可知道CIImage 可以通過其他方式轉換CGImageRef
CIContext *context = [CIContext contextWithOptions:nil]; CIImage *ciImage = [CIImage imageWithContentsOfURL:myURL]; filter = [filterWithName:@"CISepiaTone"]; [filter setValue:ciImage forKey:kCIInputImageKey]; [filter setValue:@0.8f forKey:kCIInputIntensityKey]; CIImage *outputImg = [filter outputImage]; CGImageRef cgImage = [context createCGImage:outputImg fromRect:[outputImg extent]];
- 1
- 2
- 3
- 4
- 5
- 6
- 7
最主要的一句
CGImageRef cgImage = [context createCGImage:outputImg fromRect:[outputImg extent]];
- 1
2.4 UIImage 轉換CIImage
CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImageUIImage *image = [[UIImage alloc] initWithCIImage:ciImage];
- 1
- 2
但是採用這種方式轉換,CIImage的值會是nil, 相反 採用CIImage 的initWithCGImage初始化的方式 則有值,很奇怪
UIImage *image = [UIImage imageNamed:@"test.png"]; CIImage *ciImage = [[CIImage alloc]initWithCGImage:image.CGImage];
- 1
- 2
- 3
由此可見,三者都可以實現轉換了,通過直接或者間接把他們聯絡起來。 UIImage –> CGImageRef –> CIImage UIImage <– CGImageRef <– CIImage