Sottrarre un'image da un altro iOS

Qualcuno sa come creare la sottrazione di una UIImage da un altro UIImage

per esempio come questa schermata:

inserisci la descrizione dell'immagine qui

Grazie per la risposta!

Solutions Collecting From Web of "Sottrarre un'image da un altro iOS"

cosa significa sottrarre un'image? l'image di esempio mostrata mostra più di una operazione! rosso. diciamo che per sottrarre l'image a dall'image b significa impostare each pixel in b che intersechi un pixel in a trasparente. per eseguire la sottrazione, ciò che stiamo facendo è mascherare l'image b all'inverso dell'image a. quindi, un buon approccio sarebbe quello di creare una maschera image dal canale alfa dell'image a, quindi applicarla a b. per creare la maschera faresti qualcosa del genere:

// get access to the image bytes CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); // create a buffer to hold the mask values size_t width = CGImageGetWidth(image.CGImage); size_t height = CGImageGetHeight(image.CGImage); uint8_t *maskData = malloc(width * height); // iterate over the pixel data, reading the alpha value uint8_t *alpha = (uint8_t *)CFDataGetBytePtr(pixelData) + 3; uint8_t *mask = maskData; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { *mask = *alpha; mask++; alpha += 4; // skip to the next pixel } } // create the mask image from the buffer CGDataProviderRef maskProvider = CGDataProviderCreateWithData(NULL, maskData, width * height, NULL); CGImageRef maskImage = CGImageMaskCreate(width, height, 8, 8, width, maskProvider, NULL, false); // cleanup CFRelease(pixelData); CFRelease(maskProvider); free(maskData); 

wow. quindi, per mascherare l'image b, tutto ciò che devi fare è:

 CGImageRef subtractedImage = CGImageCreateWithMask(b.CGImage, maskImage); 

hey presto.

Credo che tu possa farlo usando la modalità di fusione kCGBlendModeDestinationOut . Crea un nuovo context, disegna la tua image di background, quindi disegna l'image in primo piano con questa modalità di fusione.

 UIGraphicsBeginImageContextWithOptions(sourceImage.size, NO, sourceImage.scale) [sourceImage drawAtPoint:CGPointZero]; [maskImage drawAtPoint:CGPointZero blendMode:kCGBlendModeDestinationOut alpha:1.0f]; UIImage *result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext(); 

Per get questi risultati, usa la seconda image come maschera quando disegni la prima image. Per questo tipo di disegno, è necessario utilizzare Core Graphics, alias Quartz 2D. La Guida alla programmazione 2D di Quartz ha una sezione chiamata Immagini bitmap e maschere di immagini che dovrebbero dirti tutto quello che devi sapere.

Stai chiedendo degli oggetti UIImage, ma per usare Core Graphics avrai bisogno di CGImages. Non c'è problema: UIImage fornisce una properties; CGImage che ti consente di get facilmente i dati che ti servono.

La soluzione di Kevin Ballard ha funzionato per me! In Swift 3.x:

 func subtract(source: UIImage, mask: UIImage) -> UIImage? { UIGraphicsBeginImageContextWithOptions(source.size, false, source.scale) source.draw(at: CGPoint.zero) mask.draw(at: CGPoint.zero, blendMode: .destinationOut, alpha: 1.0) let result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return result }