How to Convert UIImage to CIImage and vice versa

前端 未结 8 1849
抹茶落季
抹茶落季 2020-12-12 19:06

I\'m trying to get CIImage from ImageView that display on the screen.

UIImage *image = myImageView.image;

convert image

相关标签:
8条回答
  • 2020-12-12 19:19

    While Changxing Wang's answer is effectively correct, Apple says that UIImage.CIImage won't always work. Specifically, from PocketCoreImage:

    // Create a CIImage from the _inputImage.  While UIImage has a property returning
    // a CIImage representation of it, there are cases where it will not work.  This is the
    // most compatible route.
    _filteredImage = [[CIImage alloc] initWithCGImage:_inputImage.CGImage options:nil];
    

    Apple also uses the following, which DOESN'T work for me:

    [UIImage imageWithCIImage:_filteredImage] 
    

    My personal implementation, adapted from this post does work for me:

    // result is a CIImage, output of my filtering.  
    // returnImage is (obviously) a UIImage that I'm going to return.
    CIContext *context = [CIContext contextWithOptions:nil];
    UIImage *returnImage = 
    [UIImage imageWithCGImage:[context createCGImage:result fromRect:result.extent]];
    
    0 讨论(0)
  • 2020-12-12 19:20

    Swift 3/4

    UIImage > CIImage

    let ciimage = CIImage(image: image)

    https://developer.apple.com/documentation/uikit/uiimage/1624090-init

    CIImage > UIImage

    let image = UIImage(ciImage: ciimage)

    https://developer.apple.com/documentation/coreimage/ciimage/1624119-init

    0 讨论(0)
  • 2020-12-12 19:32

    Swift example of changx's answer:

    guard let ciimage = CIImage(image: uiimage) else { return }
    let image = UIImage(CIImage: ciimage)
    
    0 讨论(0)
  • 2020-12-12 19:32

    When converting UIImage to CIImage, I had 2 separate cases where it's sometimes nil and sometimes not. Below code solved it:

    CIImage *ciImage;
    ciImage=[[CIImage alloc] initWithImage:imageToConvert];
    if (ciImage==nil)
        ciImage=imageToConvert.CIImage;
    
    0 讨论(0)
  • 2020-12-12 19:33

    This is most compatibile way of doing it:

    UIImage* u =[UIImage imageNamed:@"image.png"];
    CIImage* ciimage = [[CIImage alloc] initWithCGImage:u.CGImage];
    

    now use ciimage...

    and Swift version:

    let i1 = UIImage(named: "testImage")
    if let cgi1 = i1?.cgImage {
       let ci = CIImage(cgImage: cgi1)
       //use ci
    }
    

    (fixed typo in the if let statement)

    0 讨论(0)
  • 2020-12-12 19:34
    CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage;
    UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];
    

    To fix the case where myUIImage.CIImage returns nil like [UIImageView image], you can instead do [CIImage imageWithCGImage:myUIImage.CGImage] – Dylan Hand

    Swift version:

    let ciImage = UIImage(named: "test.png")!.ciImage
    let uiImage = UIImage(ciImage: ciImage)
    

    To fix the case where myUIImage.ciImage returns nil like you can instead do CIImage(cgImage: myUIImage!.cgImage!).

    0 讨论(0)
提交回复
热议问题