2017-04-04 2 views
0

Mon code effectue les opérations suivantes:Comment appliquer un masque à enregistrer l'image (swift3)

  1. Prenez une photo et l'afficher en mode image. enter image description here
  2. enregistrer la vue de l'image dans un format personnalisé en utilisant cgrect dans la galerie photo. enter image description here

Cependant, mon problème est le masque est transféré à ne pas être l?.draw(in: CGRect(x: 10, y: 240.5, width: 435 , height: 435), blendMode: .normal, alpha: 1.0). Tout ce que je veux faire est de sauvegarder la photo avec le masque.

import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
var screenView: UIImageView! 

var image1 = UIImage(named: "w") 
var image3 = UIImage(named: "w") 
var image2 = UIImage(named: "w") 
func cropImageIntoQuarterSquare(image: UIImage) -> UIImage? { 
    let originalImageSize: CGSize = image.size 
    let smallImageSize = CGSize(width: (originalImageSize.width + 40), height: (originalImageSize.height + 40)) 
    UIGraphicsBeginImageContext(smallImageSize) 
    image.draw(at: CGPoint.zero) 
    let imageResult = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return imageResult 
} 
var currentImageView: UIImageView? 
@IBOutlet var photoDispaly: UIImageView! 
override func viewDidLoad() { 
    super.viewDidLoad() 

} 
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
    self.currentImageView?.image = image 
    self.dismiss(animated: true) 

} 
func saveImage(image1: UIImage, image2: UIImage, image3: UIImage) -> UIImage? { 

    screenView = UIImageView() 

    let newSize = CGSize(width: 900, height: 1200) 
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0) 
    defer { UIGraphicsEndImageContext() } 
    UIColor.black.setFill() 
    UIBezierPath(rect: CGRect(origin: .zero, size: newSize)).fill() 
    UIGraphicsGetImageFromCurrentImageContext() 

    let l = photoDispaly.image 

    let image = photoDispaly.image 

    let maskingImage = UIImage(named: "mask5") 

    photoDispaly.image = maskImage(image: image!, mask: maskingImage!) 
    photoDispaly.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin] 
    photoDispaly.contentMode = .scaleAspectFit // OR .scaleAspectFill 
    photoDispaly.clipsToBounds = true 

    l?.draw(in: CGRect(x: 10, y: 240.5, width: 435 , height: 435), blendMode: .normal, alpha: 1.0) 

    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 

    screenView.frame = CGRect(x:0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 

    self.view.addSubview(screenView) 
    return newImage 
} 
@IBAction func takePhot(_ sender: Any) { 
    self.currentImageView = self.photoDispaly 
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){ 
     let imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 

     imagePicker.sourceType = UIImagePickerControllerSourceType.camera; 
     imagePicker.allowsEditing = false 
     self.present(imagePicker, animated: true, completion: nil) 
    } 

} 

func maskImage(image:UIImage, mask:(UIImage))->UIImage{ 
    let imageReference = image.cgImage 
    let maskReference = mask.cgImage 
    let imageMask = CGImage(maskWidth: maskReference!.width, 
          height: maskReference!.height, 
          bitsPerComponent: maskReference!.bitsPerComponent, 
          bitsPerPixel: maskReference!.bitsPerPixel, 
          bytesPerRow: maskReference!.bytesPerRow, 
          provider: maskReference!.dataProvider!, decode: nil, shouldInterpolate: true) 
    let maskedReference = imageReference!.masking(imageMask!) 
    let maskedImage = UIImage(cgImage:maskedReference!) 
    return maskedImage 
} 


func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) { 
    if let error = error { 
      return 
    } else { 
     return 
    } 
} 


@IBAction func savePhoto(_ sender: Any) { 

    guard let croppedImage = cropImageIntoQuarterSquare(image: image2!), 
     let combinedImage = saveImage(image1: image1!, image2: croppedImage, image3: croppedImage) else { 

      return 
    } 

    UIImageWriteToSavedPhotosAlbum(combinedImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) 

}} 
+0

Conseil: ajouter des commentaires à votre code pour aider les autres à comprendre ce qu'il est censé faire (peut aussi vous aider à comprendre ce qui est * pas * faire ce que vous pensez qu'il devrait faire). En outre, il serait utile si vous montriez l'image "masque" que vous essayez d'utiliser, et ce que vous attendez du résultat. – DonMag

+0

J'ai compris que le code doit être dans le func cropImageIntoQuarterSquare –

Répondre

0
import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
var screenView: UIImageView! 

var image1 = UIImage(named: "w") 
var image3 = UIImage(named: "w") 
var image2 = UIImage(named: "w") 
func cropImageIntoQuarterSquare(image: UIImage) -> UIImage? { 

    let image = photoDispaly.image 

    let maskingImage = UIImage(named: "mask5") 



    photoDispaly.image = maskImage(image: image!, mask: maskingImage!) 
    photoDispaly.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin] 
    photoDispaly.contentMode = .scaleAspectFit // OR .scaleAspectFill 
    photoDispaly.clipsToBounds = true 


    let originalImageSize: CGSize = image!.size 
    let smallImageSize = CGSize(width: (originalImageSize.width + 40), height: (originalImageSize.height + 40)) 
    UIGraphicsBeginImageContext(smallImageSize) 
    image?.draw(at: CGPoint.zero) 
    let imageResult = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return imageResult 
} 
var currentImageView: UIImageView? 
@IBOutlet var photoDispaly: UIImageView! 
override func viewDidLoad() { 
    super.viewDidLoad() 



} 
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
    self.currentImageView?.image = image 
    self.dismiss(animated: true) 

} 


func saveImage(image1: UIImage, image2: UIImage, image3: UIImage) -> UIImage? { 



    screenView = UIImageView() 

    let newSize = CGSize(width: 900, height: 1200) 
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0) 
    defer { UIGraphicsEndImageContext() } 
    UIColor.black.setFill() 
    UIBezierPath(rect: CGRect(origin: .zero, size: newSize)).fill() 
    UIGraphicsGetImageFromCurrentImageContext() 



    let l = photoDispaly.image 






     l?.draw(in: CGRect(x: 10, y: 240.5, width: 435 , height: 435), blendMode: .normal, alpha: 1.0) 




    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 

    screenView.frame = CGRect(x:0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 

    self.view.addSubview(screenView) 
    return newImage 
} 
@IBAction func takePhot(_ sender: Any) { 
    self.currentImageView = self.photoDispaly 
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){ 
     let imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 




     imagePicker.sourceType = UIImagePickerControllerSourceType.camera; 
     imagePicker.allowsEditing = false 
     self.present(imagePicker, animated: true, completion: nil) 


    } 

} 

func maskImage(image:UIImage, mask:(UIImage))->UIImage{ 
    let imageReference = image.cgImage 
    let maskReference = mask.cgImage 
    let imageMask = CGImage(maskWidth: maskReference!.width, 
          height: maskReference!.height, 
          bitsPerComponent: maskReference!.bitsPerComponent, 
          bitsPerPixel: maskReference!.bitsPerPixel, 
          bytesPerRow: maskReference!.bytesPerRow, 
          provider: maskReference!.dataProvider!, decode: nil, shouldInterpolate: true) 
    let maskedReference = imageReference!.masking(imageMask!) 
    let maskedImage = UIImage(cgImage:maskedReference!) 
    return maskedImage 
} 



func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) { 
    if let error = error { 
      return 
    } else { 
     return 

    }} 


@IBAction func savePhoto(_ sender: Any) { 

    guard let croppedImage = cropImageIntoQuarterSquare(image: image1!), 
     let combinedImage = saveImage(image1: image1!, image2: croppedImage, image3: croppedImage) 




     else { 

      return 
    } 

    UIImageWriteToSavedPhotosAlbum(combinedImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) 
    }}