尝试在照片库iOS中将图像添加到图像上

时间:2018-01-12 15:00:51

标签: ios swift

我正在构建我的应用程序的一部分:

  1. 上传照片
  2. 随后在这些照片上添加圈子
  3. 将这些照片保存在圈子上
  4. 我可以执行第1步,但需要第2步和第3步的帮助。

    这是我到目前为止的代码。请让我知道什么是错的。

    @IBAction func openPhotoLibraryButton(sender: AnyObject) {
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary;
            imagePicker.allowsEditing = true
            self.present(imagePicker, animated: true, completion: nil)
        }
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        imagePicked.image = image
        dismiss(animated:true, completion: nil)
    

    这是我在选择的图像中添加圆圈时遇到问题的部分:

    func DrawOnImage(imagePicked: UIImage) -> UIImage {
        UIGraphicsBeginImageContext(imagePicked.size)
    
        imagePicked.draw(at: CGPoint.zero)
    
        let context = UIGraphicsGetCurrentContext()!
        context.setStrokeColor(UIColor.green.cgColor)
        context.setAlpha(1.0)
        context.setLineWidth(10.0)
        context.addEllipse(in: CGRect(x: 100, y: 100, width: 100, height: 100))
        context.drawPath(using: .stroke)
    
        let myImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        return myImage!
    }
    

    我遇到的麻烦是圆圈出现在整个屏幕上并且没有限制在图像上。我想导出带有标记圆圈的图像。

1 个答案:

答案 0 :(得分:0)

看来你的第一部分正在发挥作用。第二部分我测试过并且工作正常,对于第三部分我不确定你甚至尝试了什么,我不确定你的意思是“保存那些照片”。 “把它们保存在哪里?”会是最麻烦的。

无论如何要完成第二和第三部分,我创建了一个新的应用程序并将代码移植到其中,然后添加代码以绘制几个圆圈并将图像作为PNG文件保存到临时目录中。我已经对你的代码进行了一些现代化改造,但我向你保证,你的代码工作得非常好。

要重现我所做的,您需要创建一个新的iOS单视图应用程序并更改“ViewController.swift”文件以包含以下内容:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        testDrawingToImage()
    }

    private func drawCircle(circle: (center: CGPoint, radius: CGFloat), withColor color: UIColor, lineWidth: CGFloat, onImage image: UIImage) -> UIImage? {
        // Create canvas
        UIGraphicsBeginImageContext(image.size)

        // Draw fullsize image
        image.draw(at: CGPoint.zero)

        // Draw circle
        color.setStroke()
        let path = UIBezierPath(ovalIn: CGRect(x: circle.center.x-circle.radius, y: circle.center.y-circle.radius, width: circle.radius*2.0, height: circle.radius*2.0))
        path.lineWidth = lineWidth
        path.stroke()

        // Extract image
        let outputImage = UIGraphicsGetImageFromCurrentImageContext()

        // End current context
        UIGraphicsEndImageContext()

        return outputImage
    }


    private func testDrawingToImage() {

        // Get image from assets
        let image = UIImage(named: "test")

        // Have some var image on which we will keep drawing
        var newImage: UIImage? = image

        // Draw a few circles on it
        if let image = newImage {
            newImage = drawCircle(circle: (center: CGPoint(x: 200.0, y: 200.0), radius: 60.0), withColor: UIColor.green, lineWidth: 5.0, onImage: image)
        }
        if let image = newImage {
            newImage = drawCircle(circle: (center: CGPoint(x: 200.0, y: 200.0), radius: 80.0), withColor: UIColor.blue, lineWidth: 12.0, onImage: image)
        }
        if let image = newImage {
            newImage = drawCircle(circle: (center: CGPoint(x: 200.0, y: 200.0), radius: 140.0), withColor: UIColor.black, lineWidth: 6.0, onImage: image)
        }
        if let image = newImage {
            newImage = drawCircle(circle: (center: CGPoint(x: 100.0, y: 100.0), radius: 40.0), withColor: UIColor.red, lineWidth: 30.0, onImage: image)
        }

        // Now save it to temporary directory
        if let image = newImage {
            let pngData = UIImagePNGRepresentation(image)
            try? pngData?.write(to: URL(fileURLWithPath: NSTemporaryDirectory() + "/outputImage.png"))
            print("All done!")
        }

    }

}

代码已注释,应该自行说明。它确实希望您在资产目录中包含名为“test”的图像,否则不会发生任何事情,因为所有if语句都将失败。

这是我的结果(左边的原始图像和右边的结果图像):

enter image description here

您可以清楚地看到正确绘制到图像的4个圆圈。在我的情况下,原始图像分辨率是1440×1080,这在定义圆坐标时很重要;如果您的图像非常小,那么您将看不到圆圈,因为它们将被“屏幕外”绘制。