Right Now I have two image views. All the button does is save the photo with the red box over the blue box and it will save image2 in the blue box and image1 in the red box. I would like red box to be saved over the blue box in just the small bottom right section of the blue box. Just like a lower third you see on tv ]]
class ViewController: UIViewController {
var image1 = UIImage(named: "f.jpg")
var image2 = UIImage(named: "l.jpg")
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
func saveImage(image1:UIImage, image2:UIImage) -> UIImage {
let size1 = image1.size
let size2 = image2.size
let origin = CGPoint(x: size1.width-size2.width, y: size1.height - size2.height)
UIGraphicsBeginImageContextWithOptions(size2, false, 0.0)
image1.draw(in: CGRect(origin: CGPoint.zero, size: size1))
image2.draw(in: CGRect(origin: origin, size: size2))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
@IBAction func d(_ sender: Any) {
UIImageWriteToSavedPhotosAlbum(saveImage(image1:image1!, image2:image2!), self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
}
func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
if let error = error {
// we got back an error!
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
} else {
let ac = UIAlertController(title: "Saved!", message: "Your altered image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
}}
Try this
// returns a new image where image2 in the bottom right corner of image1
func saveImage(image1:UIImage, image2:UIImage) -> UIImage {
let size1 = image1.size
let size2 = image2.size
let origin = CGPoint(x: size1.width-size2.width, y: size1.height - size2.height)
UIGraphicsBeginImageContextWithOptions(size1, false, 0.0)
image1.draw(in: CGRect(origin: CGPoint.zero, size: size1))
image2.draw(in: CGRect(origin: origin, size: size2))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
This is the output
To use this function to save to the photo album:
@IBAction func save(_ sender: Any) {
UIImageWriteToSavedPhotosAlbum(saveImage(image1:image1, image2:image2), self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
}
func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
if let error = error {
// we got back an error!
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
} else {
let ac = UIAlertController(title: "Saved!", message: "Your altered image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
}
From this tutorial
The code you have in saveImage function should work - assuming that image1 is larger than image2, however, if image1 and image2 are the same sizes then you will only see the second image because the origin will become (0,0). So in other words, if image1 and image2 are both 300x300, then image2 draws over image1.
The IBAction method appears to be wired up correctly and I believe what you are missing is some logic to resize the second image. Use the code below to guide you, the math will likely change depending on what ratio of image1 to image2 you're looking for.
func cropImageIntoQuarterSquare(image: UIImage) -> UIImage? {
let originalImageSize: CGSize = image.size
let smallImageSize = CGSize(width: (originalImageSize.width / 4), height: (originalImageSize.height / 4))
UIGraphicsBeginImageContext(smallImageSize)
image.draw(at: CGPoint.zero)
let imageResult = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return imageResult
}
If you incorporate the resizing code then your IBAction might look something like this:
@IBAction func save(_ sender: Any) {
guard let croppedImage = cropImageIntoQuarterSquare(image: image2),
let combinedImage = saveImage(image1: image1, image2: croppedImage) else {
// handle the error
return
}
UIImageWriteToSavedPhotosAlbum(combinedImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
}
func saveImage(image1: UIImage, image2: UIImage) -> UIImage? {
let size1 = image1.size
let size2 = image2.size
let origin = CGPoint(x: size1.width - size2.width, y: size1.height - size2.height)
UIGraphicsBeginImageContext(size1)
image1.draw(in: CGRect(origin: CGPoint.zero, size: size1))
image2.draw(in: CGRect(origin: origin, size: size2))
let combinedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return combinedImage
}
func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
if let error = error {
// we got back an error!
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
} else {
let ac = UIAlertController(title: "Saved!", message: "Your altered image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
present(ac, animated: true)
}
}
Edit: Forgot to give credit to @Peter Tao for some of the code he already provided - and the link from hackingwithswift.com he provided.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.