Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I add text to an image in iOS Swift?

Tags:

ios

swift

uiimage

I have looked around and have been unsuccessful at figuring out how take text, overlay it on an image, and then combine the two into a single UIImage.

I have exhausted Google using the search terms I can think of so if anyone has a solution or at least a hint they can point to it would be greatly appreciated.

like image 946
Christopher Wade Cantley Avatar asked Mar 06 '15 20:03

Christopher Wade Cantley


1 Answers

Ok... I figured it out:

func textToImage(drawText: NSString, inImage: UIImage, atPoint: CGPoint) -> UIImage{      // Setup the font specific variables     var textColor = UIColor.whiteColor()     var textFont = UIFont(name: "Helvetica Bold", size: 12)!      // Setup the image context using the passed image     let scale = UIScreen.mainScreen().scale     UIGraphicsBeginImageContextWithOptions(inImage.size, false, scale)      // Setup the font attributes that will be later used to dictate how the text should be drawn     let textFontAttributes = [         NSFontAttributeName: textFont,         NSForegroundColorAttributeName: textColor,     ]      // Put the image into a rectangle as large as the original image     inImage.drawInRect(CGRectMake(0, 0, inImage.size.width, inImage.size.height))      // Create a point within the space that is as bit as the image     var rect = CGRectMake(atPoint.x, atPoint.y, inImage.size.width, inImage.size.height)      // Draw the text into an image     drawText.drawInRect(rect, withAttributes: textFontAttributes)      // Create a new image out of the images we have created     var newImage = UIGraphicsGetImageFromCurrentImageContext()      // End the context now that we have the image we need     UIGraphicsEndImageContext()      //Pass the image back up to the caller     return newImage  } 

To call it, you just pass in an image:

textToImage("000", inImage: UIImage(named:"thisImage.png")!, atPoint: CGPointMake(20, 20)) 

The following links helped me get this straight:

Swift - Drawing text with drawInRect:withAttributes:

How to write text on image in Objective-C (iOS)?

The original goal was to create a dynamic image that I could use in an AnnotaionView such as putting a price at a given location on a map and this worked out great for it. Hope this helps someone trying to do the same thing.

For Swift 3:

 func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {     let textColor = UIColor.white     let textFont = UIFont(name: "Helvetica Bold", size: 12)!      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))      let rect = CGRect(origin: point, size: image.size)     text.draw(in: rect, withAttributes: textFontAttributes)      let newImage = UIGraphicsGetImageFromCurrentImageContext()     UIGraphicsEndImageContext()      return newImage!  } 

For Swift 4:

 func textToImage(drawText text: String, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {     let textColor = UIColor.white     let textFont = UIFont(name: "Helvetica Bold", size: 12)!      let scale = UIScreen.main.scale     UIGraphicsBeginImageContextWithOptions(image.size, false, scale)      let textFontAttributes = [         NSAttributedStringKey.font: textFont,         NSAttributedStringKey.foregroundColor: textColor,         ] as [NSAttributedStringKey : Any]     image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))      let rect = CGRect(origin: point, size: image.size)     text.draw(in: rect, withAttributes: textFontAttributes)      let newImage = UIGraphicsGetImageFromCurrentImageContext()     UIGraphicsEndImageContext()      return newImage!  } 

For Swift 5:

func textToImage(drawText text: String, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {     let textColor = UIColor.white     let textFont = UIFont(name: "Helvetica Bold", size: 12)!      let scale = UIScreen.main.scale     UIGraphicsBeginImageContextWithOptions(image.size, false, scale)      let textFontAttributes = [         NSAttributedString.Key.font: textFont,         NSAttributedString.Key.foregroundColor: textColor,         ] as [NSAttributedString.Key : Any]     image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))      let rect = CGRect(origin: point, size: image.size)     text.draw(in: rect, withAttributes: textFontAttributes)      let newImage = UIGraphicsGetImageFromCurrentImageContext()     UIGraphicsEndImageContext()      return newImage! } 
like image 138
Christopher Wade Cantley Avatar answered Oct 07 '22 19:10

Christopher Wade Cantley