Ich arbeite an einem Projekt, bei dem ich ein Foto maskieren möchte, das der Benutzer gerade mit seiner Kamera aufgenommen hat. Die Maske wird in einem bestimmten Seitenverhältnis erstellt, um einem Foto Briefkästen hinzuzufügen.Eine Maske auf AVCaptureStillImageOutput anwenden
Ich kann erfolgreich das Bild erstellen, erstellen Sie die Maske und speichern Sie beide in der Kamera roll, aber ich kann nicht die Maske auf das Bild anwenden. Hier ist der Code Ich habe jetzt
func takePhoto() {
dispatch_async(self.sessionQueue) {() -> Void in
if let photoOutput = self.output as? AVCaptureStillImageOutput {
photoOutput.captureStillImageAsynchronouslyFromConnection(self.outputConnection) { (imageDataSampleBuffer, err) -> Void in
if err == nil {
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
let image = UIImage(data: imageData)
if let _ = image {
let maskedImage = self.maskImage(image!)
print("masked image: \(maskedImage)")
self.savePhotoToLibrary(maskedImage)
}
} else {
print("Error while capturing the image: \(err)")
}
}
}
}
}
func maskImage (image: UIImage) -> UIImage {
let mask = createImageMask(image)
let maskedImage = CGImageCreateWithMask(image.CGImage, mask!)
return UIImage(CGImage: maskedImage!)
}
func createImageMask (image: UIImage) -> CGImage? {
let width = image.size.width
let height = width/CGFloat(store.state.aspect.rawValue)
let x = CGFloat(0.0)
let y = (image.size.height - height)/2
let maskRect = CGRectMake(0.0, 0.0, image.size.width, image.size.height)
let maskContents = CGRectMake(x, y, width, height)
var color = UIColor(white: 1.0, alpha: 0.0)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(maskRect.size.width, maskRect.size.height), false, 0.0)
color.setFill()
UIRectFill(maskRect)
color = UIColor(white: 0.0, alpha: 1.0)
color.setFill()
UIRectFill(maskContents)
let maskImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
print("mask: \(maskImage)")
savePhotoToLibrary(image)
savePhotoToLibrary(maskImage)
let mask = CGImageMaskCreate(
CGImageGetWidth(maskImage.CGImage),
CGImageGetHeight(maskImage.CGImage),
CGImageGetBitsPerComponent(maskImage.CGImage),
CGImageGetBitsPerPixel(maskImage.CGImage),
CGImageGetBytesPerRow(maskImage.CGImage),
CGImageGetDataProvider(maskImage.CGImage),
nil,
false)
return mask
}
Von dem, was ich verstehe, CGImageCreateWithMask
erfordert, dass das Bild zu maskierenden hat einen Alpha-Kanal. Ich habe alles versucht, was ich hier gesehen habe, um der JPEG-Darstellung einen Alpha-Kanal hinzuzufügen, aber ich habe kein Glück. Jede Hilfe wäre super.
Dies resultiert im Wesentlichen ist, was ich am Ende mit. Vielen Dank! – Mike