1. 程式人生 > >蘋果開發 筆記(48) UIImage CIImage CGImageRef

蘋果開發 筆記(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