【问题标题】:Add text to a point in image swift将文本快速添加到图像中的一个点
【发布时间】:2017-12-25 23:25:53
【问题描述】:

我正在使用 UITapGestureRecognizer 获取 UIImageView 中的坐标,然后将该坐标用作向图像添加文本的位置。文本未完全添加到我在 UIImageView 上触及的位置的问题 你能帮我解决问题或给我一些建议吗

    @IBOutlet var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        imageView.image = UIImage(named: documentsPath + "/bach.jpg")
        let imageViewTapped = UITapGestureRecognizer(target: self, action: #selector(self.tapAction(_:)))
        imageViewTapped.numberOfTouchesRequired = 1
        imageViewTapped.delegate = self
        imageView.addGestureRecognizer(imageViewTapped)
    }

    func tapAction(_ sender: UITapGestureRecognizer) {
        let point = sender.location(in: self.imageView)
        print("x \(point.x) y \(point.y) ")
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let image = UIImage(named: documentsPath + "/bach.jpg")!
        let newImage = textToImage(drawText: "㊗️Hello", inImage: image, atPoint: CGPoint(x: point.x, y: point.y))
        imageView.image = newImage
    }

    // Add text to image
    func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
        let textColor = UIColor.white
        let textFont = UIFont(name: "Helvetica Bold", size: 300)!
        let scale = UIScreen.main.scale
        UIGraphicsBeginImageContextWithOptions(image.size, false, scale)

        let textFontAttributes = [
            NSFontAttributeName: textFont,
            NSForegroundColorAttributeName: textColor,
            ] as [String : Any]
        image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
        text.draw(at: point, withAttributes: textFontAttributes)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    }

【问题讨论】:

  • 尝试用 image.draw(in: imageView.frame) 替换 image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
  • @AravindAR 不能正常工作,更改后的基本图像变小了

标签: ios swift swift3 uiimageview


【解决方案1】:
class ViewController1: UIViewController {
let lblNew = UILabel()
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
    super.viewDidLoad()
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    imageView.image = UIImage(named: documentsPath + "/bach.jpg")
    imageView.isUserInteractionEnabled = true
    let imageViewTapped = UITapGestureRecognizer(target: self, action: #selector(self.tapAction(_:)))
    imageViewTapped.numberOfTouchesRequired = 1
    imageViewTapped.delegate = self as? UIGestureRecognizerDelegate
    imageView.addGestureRecognizer(imageViewTapped)
}

func tapAction(_ sender: UITapGestureRecognizer) {
    let point = sender.location(in: self.imageView)
    print("x \(point.x) y \(point.y) ")
    textToImage(drawText: "㊗️Hello", atPoint: CGPoint(x: point.x, y: point.y))

}

// Add text to image
func textToImage(drawText text: NSString, atPoint point: CGPoint) {

    lblNew.frame = CGRect(x: point.x, y: point.y, width: 200.0, height: 10)
    lblNew.textAlignment = .left
    lblNew.text = text as String
    lblNew.textColor = UIColor.white
    imageView.addSubview(lblNew)
}
}

【讨论】:

  • 再次感谢您。还有一个问题,我应该怎么做才能保存编辑后的图像。您的解决方案是创建一个子视图对吗??
  • 不需要子视图,首先你要保存在哪里?我的意思是你想把它保存在文档目录或图库中吗?
  • 谢谢回复,只想保存到文档目录下
【解决方案2】:

将图像直接以 png 格式保存在文档中的代码。如果您想将其保存为 jpeg 格式,只需将 UIImagePNGRepresentation 行更改为 UIImageJPEGRepresentation(image, 0.9)。

func saveImage()
{
    if let image = UIImage(named: "test.png") {
        if let data = UIImagePNGRepresentation(image) {
            let filename = getDocumentsDirectory().appendingPathComponent("copy.png")
            try? data.write(to: filename)
        }
    }
}

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

【讨论】:

  • 你这么好心帮了我,但是那个代码会保存编辑后的图像吗?前任。我触摸屏幕上的一个位置并使用您上面的代码向该位置添加文本或其他内容。最后将所有内容保存到 png 文件中。我运行你的代码,它不会保存没有任何文本的图像
  • 我不清楚你在说什么,你想把图片和文字一起保存吗?
  • 对不起,因为我的英语不好。 “你想把图片和文字一起保存吗”←是
【解决方案3】:
Replace your saveImage method with the following code snippet.

func saveImage()
{
  UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, false, UIScreen.main.scale)
  imageView.layer.render(in: UIGraphicsGetCurrentContext()!)
  let image = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext()

  if let data = UIImagePNGRepresentation(image!) {
        let filename = getDocumentsDirectory().appendingPathComponent("copy.png")
        try? data.write(to: filename)
    }
}

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 2021-06-05
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多