2017-04-04 99 views
0

我的代码执行以下操作:如何敷面膜保存图像(swift3)

  1. 拍摄照片和图像视图显示。 enter image description here
  2. 使用照片库中的cgrect将图像视图保存为自定义大小。 enter image description here

但我的问题是不被转移到l?.draw(in: CGRect(x: 10, y: 240.5, width: 435 , height: 435), blendMode: .normal, alpha: 1.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 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

快速提示:添加注释到您的代码,以帮助其他人了解什么是应该做的(也可以帮助你了解什么是*不*做什么,你认为它应该做的)。此外,如果您显示您正在尝试使用的“蒙版”图像,以及您期望得到的结果如何,这将有所帮助。 – DonMag

+0

我想到了代码必须在func cropImageIntoQuarterSquare –

回答

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) 
    }}