在iOS上将文本转换为图像 [英] Converting Text to Image on iOS
问题描述
如何将Text转换为Image并在UIImageview中显示. 谁能知道从文本到图像的转换?
How to convert Text to Image and show in UIImageview. Can anyone know the conversion from Text to Image?
推荐答案
使用Swift 5和iOS 12,您可以选择 6种以下方式之一来解决您的问题.
With Swift 5 and iOS 12, you can choose one the 6 following ways in order to solve your problem.
在最简单的情况下,您要将具有某些属性的String
转换为UIImage
,可以使用
In the simplest case where you want to convert a String
to a UIImage
with some attributes, you can use draw(at:withAttributes:)
. The following Playground codes show how to get an UIImage
from a String
using draw(at:withAttributes:)
:
import UIKit
import PlaygroundSupport
let text = "Hello, world"
let attributes = [
NSAttributedString.Key.foregroundColor: UIColor.yellow,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 22)
]
let textSize = text.size(withAttributes: attributes)
UIGraphicsBeginImageContextWithOptions(textSize, true, 0)
text.draw(at: CGPoint.zero, withAttributes: attributes)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
PlaygroundPage.current.liveView = UIImageView(image: image)
import UIKit
import PlaygroundSupport
let text = "Hello, world"
let attributes = [
NSAttributedString.Key.foregroundColor: UIColor.yellow,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 22)
]
let textSize = text.size(withAttributes: attributes)
let renderer = UIGraphicsImageRenderer(size: textSize)
let image = renderer.image(actions: { context in
text.draw(at: CGPoint.zero, withAttributes: attributes)
})
PlaygroundPage.current.liveView = UIImageView(image: image)
请注意,NSAttributedString
具有类似的方法,称为draw(at:)
.
Note that NSAttributedString
has a similar method called draw(at:)
.
作为draw(at:withAttributes:)
的替代方法,您可以使用 draw(in:withAttributes:)
.
As an alternative to draw(at:withAttributes:)
, you can use draw(in:withAttributes:)
.
import UIKit
import PlaygroundSupport
let text = "Hello, world"
let attributes = [
NSAttributedString.Key.foregroundColor: UIColor.yellow,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 22)
]
let textSize = text.size(withAttributes: attributes)
UIGraphicsBeginImageContextWithOptions(textSize, true, 0)
let rect = CGRect(origin: .zero, size: textSize)
text.draw(in: rect, withAttributes: attributes)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
PlaygroundPage.current.liveView = UIImageView(image: image)
import UIKit
import PlaygroundSupport
let text = "Hello, world"
let attributes = [
NSAttributedString.Key.foregroundColor: UIColor.yellow,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 22)
]
let textSize = text.size(withAttributes: attributes)
let renderer = UIGraphicsImageRenderer(size: textSize)
let image = renderer.image(actions: { context in
let rect = CGRect(origin: .zero, size: textSize)
text.draw(in: rect, withAttributes: attributes)
})
PlaygroundPage.current.liveView = UIImageView(image: image)
请注意,NSAttributedString
具有类似的方法,称为draw(in:)
.
Note that NSAttributedString
has a similar method called draw(in:)
.
作为draw(at:withAttributes:)
和draw(in:)
的替代,您可以使用 draw(with:options:attributes:context:)
.请注意,苹果为draw(with:options:attributes:context:)
提供了一些建议:
As an alternative to draw(at:withAttributes:)
and draw(in:)
, you can use draw(with:options:attributes:context:)
. Note that Apple has some recommendations for draw(with:options:attributes:context:)
:
此方法默认情况下使用基线原点. 如果未指定
usesLineFragmentOrigin
,则矩形的高度将被忽略,并且该操作被视为单行渲染.
This method uses the baseline origin by default. If
usesLineFragmentOrigin
is not specified, the rectangle’s height will be ignored and the operation considered to be single-line rendering.
import UIKit
import PlaygroundSupport
let text = "Hello, world"
let attributes = [
NSAttributedString.Key.foregroundColor: UIColor.yellow,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 22)
]
let textSize = text.size(withAttributes: attributes)
UIGraphicsBeginImageContextWithOptions(textSize, true, 0)
let rect = CGRect(origin: .zero, size: textSize)
text.draw(with: rect, options: [.usesLineFragmentOrigin], attributes: attributes, context: nil)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
PlaygroundPage.current.liveView = UIImageView(image: image)
import UIKit
import PlaygroundSupport
let text = "Hello, world"
let attributes = [
NSAttributedString.Key.foregroundColor: UIColor.yellow,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 22)
]
let textSize = text.size(withAttributes: attributes)
let renderer = UIGraphicsImageRenderer(size: textSize)
let image = renderer.image(actions: { context in
text.draw(with: .zero, options: [.usesLineFragmentOrigin], attributes: attributes, context: nil)
})
PlaygroundPage.current.liveView = UIImageView(image: image)
请注意,NSAttributedString
具有类似的方法,称为draw(with:options:context:)
.
Note that NSAttributedString
has a similar method called draw(with:options:context:)
.
如果要将UILabel
,UITextField
或UITextView
的文本捕获到UIImage
,则可以使用
If you want to capture the text of a UILabel
, UITextField
or UITextView
to a UIImage
, you can use render(in:)
. The following Playground codes show how to snapshot the content text of a UILabel
using render(in:)
:
import UIKit
import PlaygroundSupport
let label = UILabel(frame: .zero)
label.textColor = .yellow
label.font = UIFont.systemFont(ofSize: 22)
label.text = "Hello, world"
label.sizeToFit()
UIGraphicsBeginImageContextWithOptions(label.frame.size, true, 0)
guard let context = UIGraphicsGetCurrentContext() else { exit(0) }
label.layer.render(in: context)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
PlaygroundPage.current.liveView = UIImageView(image: image)
import UIKit
import PlaygroundSupport
let label = UILabel(frame: .zero)
label.textColor = .yellow
label.font = UIFont.systemFont(ofSize: 22)
label.text = "Hello, world"
label.sizeToFit()
let renderer = UIGraphicsImageRenderer(size: label.frame.size)
let image = renderer.image(actions: { context in
label.layer.render(in: context.cgContext)
})
PlaygroundPage.current.liveView = UIImageView(image: image)
#5.使用UIView
的drawHierarchy(in:afterScreenUpdates:)
方法
如果要将UILabel
,UITextField
或UITextView
的文本捕获到UIImage
,则可以使用
#5. Using UIView
's drawHierarchy(in:afterScreenUpdates:)
method
If you want to capture the text of a UILabel
, UITextField
or UITextView
to a UIImage
, you can use drawHierarchy(in:afterScreenUpdates:)
. Note that Apple has some recommendations for drawHierarchy(in:afterScreenUpdates:)
:
当您要将图形效果(例如模糊)应用于视图快照时,请使用此方法.此方法不如
snapshotView(afterScreenUpdates:)
方法快.
import UIKit
import PlaygroundSupport
let label = UILabel(frame: .zero)
label.textColor = .yellow
label.font = UIFont.systemFont(ofSize: 22)
label.text = "Hello, world"
label.sizeToFit()
UIGraphicsBeginImageContextWithOptions(label.frame.size, true, 0)
_ = label.drawHierarchy(in: label.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
PlaygroundPage.current.liveView = UIImageView(image: image)
import UIKit
import PlaygroundSupport
let label = UILabel(frame: .zero)
label.textColor = .yellow
label.font = UIFont.systemFont(ofSize: 22)
label.text = "Hello, world"
label.sizeToFit()
let renderer = UIGraphicsImageRenderer(size: label.frame.size)
let image = renderer.image(actions: { context in
_ = label.drawHierarchy(in: label.bounds, afterScreenUpdates: true)
})
PlaygroundPage.current.liveView = UIImageView(image: image)
#6.使用UIView
的snapshotView(afterScreenUpdates:)
方法
如果可以从快照操作中获取UIView
而不是UIImage
,则可以使用
#6. Using UIView
's snapshotView(afterScreenUpdates:)
method
If it's OK for you to get a UIView
instead of a UIImage
from your snapshot operation, you can use snapshotView(afterScreenUpdates:)
. The following Playground code shows how to snapshot the content text of a UILabel
into a UIView
using snapshotView(afterScreenUpdates:)
:
import UIKit
import PlaygroundSupport
let label = UILabel(frame: .zero)
label.textColor = .yellow
label.font = UIFont.systemFont(ofSize: 22)
label.text = "Hello, world"
label.sizeToFit()
let view = label.snapshotView(afterScreenUpdates: true)
PlaygroundPage.current.liveView = view
这篇关于在iOS上将文本转换为图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!