在图像上绘制的文本延伸出图像
text draw on image extending off the image
我正在使用 的答案在图像上绘制文本。我遇到的问题是当 CGPoint 设置在图像的右边缘附近时,文本会超出图像。我正在尝试找出一种从 CGPoint 向左而不是向右绘制的方法,或者以某种方式计算将要绘制的文本的点大小,然后移动绘制点以适应此大小。
这是我正在使用的代码。
func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
let color = UserDefaults.standard.colorForKey(key: "color")!
let font = UserDefaults.standard.value(forKey: "font") as! String
let size = UserDefaults.standard.value(forKey: "size") as! Int
let fontAndSize = UIFont(name: font, size: CGFloat(size))!
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(image.size, false, scale)
let textFontAttributes = [
NSFontAttributeName: fontAndSize,
NSForegroundColorAttributeName: color,
] 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!
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let mediaType = info[UIImagePickerControllerMediaType] as? String {
if mediaType.isEqual((kUTTypeImage as String)) {
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
let width = pickedImage.size.width
let height = pickedImage.size.height
// this puts the point in the bottom right of the image which then causes the text drawn to extend off of the image
let point = CGPoint(x: width - 20, y: height - 50)
let timestampText = getTimestampText() as NSString
let timestampImage = textToImage(drawText: timestampText, inImage: pickedImage, atPoint: point)
if newMedia {
UIImageWriteToSavedPhotosAlbum(timestampImage, nil, nil, nil)
}
}
您可以尝试使用 NSParagraphStyleAttributeName
将文本右对齐
let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle
textStyle.alignment = NSTextAlignment.rightTextAlignment
let textFontAttributes = [
NSFontAttributeName: fontAndSize,
NSForegroundColorAttributeName: color,
NSParagraphAttributeStyleName: textStyle
] as [String : Any]
如果想向左画,其实可以"calculate the size in points of the text that will be drawn then move the draw point to accommodate for this size"使用boundingRectWithSize:options:attributes:context:
。例如:
func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
let color = UserDefaults.standard.colorForKey(key: "color")!
let font = UserDefaults.standard.value(forKey: "font") as! String
let size = UserDefaults.standard.value(forKey: "size") as! Int
let fontAndSize = UIFont(name: font, size: CGFloat(size))!
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(image.size, false, scale)
let textFontAttributes = [
NSFontAttributeName: fontAndSize,
NSForegroundColorAttributeName: color,
] as [String : Any]
// Calculate text size
let rectSize = text.boundingRect(with: CGSize(width:CGFloat(MAXFLOAT), height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: textFontAttributes, context: nil).size
// Subtract the text width from the x origin
let rect = CGRect(x:point.x-rectSize.width, y:point.y, width:rectSize.width, height: rectSize.height)
text.draw(in: rect, withAttributes: textFontAttributes)
}
我正在使用
这是我正在使用的代码。
func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
let color = UserDefaults.standard.colorForKey(key: "color")!
let font = UserDefaults.standard.value(forKey: "font") as! String
let size = UserDefaults.standard.value(forKey: "size") as! Int
let fontAndSize = UIFont(name: font, size: CGFloat(size))!
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(image.size, false, scale)
let textFontAttributes = [
NSFontAttributeName: fontAndSize,
NSForegroundColorAttributeName: color,
] 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!
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let mediaType = info[UIImagePickerControllerMediaType] as? String {
if mediaType.isEqual((kUTTypeImage as String)) {
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
let width = pickedImage.size.width
let height = pickedImage.size.height
// this puts the point in the bottom right of the image which then causes the text drawn to extend off of the image
let point = CGPoint(x: width - 20, y: height - 50)
let timestampText = getTimestampText() as NSString
let timestampImage = textToImage(drawText: timestampText, inImage: pickedImage, atPoint: point)
if newMedia {
UIImageWriteToSavedPhotosAlbum(timestampImage, nil, nil, nil)
}
}
您可以尝试使用 NSParagraphStyleAttributeName
let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle
textStyle.alignment = NSTextAlignment.rightTextAlignment
let textFontAttributes = [
NSFontAttributeName: fontAndSize,
NSForegroundColorAttributeName: color,
NSParagraphAttributeStyleName: textStyle
] as [String : Any]
如果想向左画,其实可以"calculate the size in points of the text that will be drawn then move the draw point to accommodate for this size"使用boundingRectWithSize:options:attributes:context:
。例如:
func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
let color = UserDefaults.standard.colorForKey(key: "color")!
let font = UserDefaults.standard.value(forKey: "font") as! String
let size = UserDefaults.standard.value(forKey: "size") as! Int
let fontAndSize = UIFont(name: font, size: CGFloat(size))!
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(image.size, false, scale)
let textFontAttributes = [
NSFontAttributeName: fontAndSize,
NSForegroundColorAttributeName: color,
] as [String : Any]
// Calculate text size
let rectSize = text.boundingRect(with: CGSize(width:CGFloat(MAXFLOAT), height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: textFontAttributes, context: nil).size
// Subtract the text width from the x origin
let rect = CGRect(x:point.x-rectSize.width, y:point.y, width:rectSize.width, height: rectSize.height)
text.draw(in: rect, withAttributes: textFontAttributes)
}