webentwicklung-frage-antwort-db.com.de

Konvertieren von UIImage in CIImage und umgekehrt

Ich versuche, CIImage von ImageView zu erhalten, das auf dem Bildschirm angezeigt wird. 

UIImage *image = myImageView.image;

bild UIImage in CIImage konvertieren.

CIImage *cImage = [....];

Wie macht man das? 

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

Um den Fall zu beheben, in dem myUIImage.CIImagenil wie [UIImageView image] zurückgibt, können Sie stattdessen [CIImage imageWithCGImage:myUIImage.CGImage] - Dylan Hand tun

Schnelle Version:

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

Während Changxing Wangs Antwort tatsächlich richtig ist, sagt Apple, dass UIImage.CIImage nicht immer funktionieren wird. Insbesondere von 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 verwendet auch Folgendes, was für mich NICHT funktioniert: 

[UIImage imageWithCIImage:_filteredImage] 

Meine persönliche Umsetzung, angepasst von diesem Beitrag arbeitet für mich:

// 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

Dies ist die kompatibelste Art, dies zu tun:

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

benutze jetzt ciimage ...

18
Juraj Antas

Hier ist ein vollständiges Codebeispiel, das ich in meinen Projekten verwendet habe.

- (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 ist im Grunde ein Rezept für ein Bild. Sie werden auf Probleme stoßen, wenn Sie versuchen, direkt von CIImage in UIImage zu konvertieren. Zum Beispiel anrufen

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

wird nil zurückgeben.

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

Ein schnelles Beispiel für die Antwort von changx :

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

Schnelles 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

Bei der Konvertierung von UIImage in CIImage hatte ich zwei verschiedene Fälle, in denen es manchmal null ist und manchmal nicht. Der folgende Code hat es gelöst:

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