我正在构建我的应用程序的一部分:
我可以执行第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!
}
我遇到的麻烦是圆圈出现在整个屏幕上并且没有限制在图像上。我想导出带有标记圆圈的图像。
答案 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语句都将失败。
这是我的结果(左边的原始图像和右边的结果图像):
您可以清楚地看到正确绘制到图像的4个圆圈。在我的情况下,原始图像分辨率是1440×1080,这在定义圆坐标时很重要;如果您的图像非常小,那么您将看不到圆圈,因为它们将被“屏幕外”绘制。