web-dev-qa-db-ja.com

UIImageをCIImageに、またはその逆に変換する方法

画面に表示されるImageViewからCIImageを取得しようとしています。

UIImage *image = myImageView.image;

画像UIImageCIImageに変換します。

CIImage *cImage = [....];

これを行う方法?

63
HelmiB
_CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage;
UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];
_

_myUIImage.CIImage_が_[UIImageView image]_のようなnilを返すケースを修正するには、代わりに_[CIImage imageWithCGImage:myUIImage.CGImage]_を実行できます– Dylan Hand

Swiftバージョン:

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

_myUIImage.ciImage_がnilを返すケースを修正するには、代わりにCIImage(cgImage: myUIImage!.cgImage!)を実行します。

119
changx

Changxing Wangの答えは事実上正しいが、AppleはUIImage.CIImageが常に機能するとは限らない。具体的には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は次のものも使用しますが、私にとってはうまくいきません。

[UIImage imageWithCIImage:_filteredImage] 

この投稿 から適応した私の個人的な実装は、私のために機能します:

// 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]];
31

これは最も互換性のある方法です:

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

今ciimageを使用して...

およびSwiftバージョン:

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

以下は、プロジェクトで使用した完全なコードサンプルです。

- (UIImage *)makeUIImageFromCIImage:(CIImage *)ciImage {
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]];

    UIImage* uiImage = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    return uiImage;
}

CIImageは基本的に画像のレシピです。 CIImageからUIImageに直接変換しようとすると、問題が発生します。たとえば、呼び出し

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

nilを返します。

13
JVillella
func toCIImage(image: UIImage) -> CIImage {
    return image.CIImage ?? CIImage(CGImage: image.CGImage!)
}

func toUIImage(image: CIImage) -> UIImage {
    return UIImage(CIImage: image)
}
11
Etan

changx の答えの迅速な例:

guard let ciimage = CIImage(image: uiimage) else { return }
let image = UIImage(CIImage: ciimage)
4
Daniel Storm

スイフト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

3
user924

UIImageをCIImageに変換するとき、2つの別個のケースがありましたが、nilである場合とそうでない場合がありました。以下のコードで解決しました:

CIImage *ciImage;
ciImage=[[CIImage alloc] initWithImage:imageToConvert];
if (ciImage==nil)
    ciImage=imageToConvert.CIImage;
1