[英]Convert Apple Emoji (String) to UIImage
I need all Apple Emojis.我需要所有 Apple 表情符号。
I can get all the emojis and put them into a String by copying them from the site getemoji but in my app i need the emojis in the right order as images .我可以通过从站点getemoji复制它们来获取所有表情符号并将它们放入字符串中,但在我的应用程序中,我需要以正确的顺序将表情符号作为图像。
Is there a nice way to convert the emojis I copy into a String to a UIImage ?有没有一种很好的方法可以将我复制的表情符号转换为 String 到UIImage ?
Or a better solution to get all the Apple emojis in the right order?或者以正确的顺序获取所有 Apple 表情符号的更好解决方案?
Add this extension to your project将此扩展添加到您的项目中
import UIKit
extension String {
func image() -> UIImage? {
let size = CGSize(width: 40, height: 40)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.white.set()
let rect = CGRect(origin: .zero, size: size)
UIRectFill(CGRect(origin: .zero, size: size))
(self as AnyObject).draw(in: rect, withAttributes: [.font: UIFont.systemFont(ofSize: 40)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
The code above draws the current String
to an Image Context with a white background color and finally transform it into a UIImage
.上面的代码将当前
String
绘制到具有白色背景色的 Image Context 中,最后将其转换为UIImage
。
Now you can write现在你可以写
Given a list of ranges indicating the unicode values of the emoji symbols给定一个范围列表,指示表情符号的 unicode 值
let ranges = [0x1F601...0x1F64F, 0x2702...0x27B0]
you can transform it into a list of images您可以将其转换为图像列表
let images = ranges
.flatMap { $0 }
.compactMap { Unicode.Scalar($0) }
.map(Character.init)
.compactMap { String($0).image() }
Result:结果:
I cannot guarantee the list of ranges is complete, you'll need to search for it by yourself 😉
我不能保证范围列表是完整的,你需要自己搜索它😉
Same thing for Swift 4: Swift 4 也一样:
extension String {
func emojiToImage() -> UIImage? {
let size = CGSize(width: 30, height: 35)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.white.set()
let rect = CGRect(origin: CGPoint(), size: size)
UIRectFill(rect)
(self as NSString).draw(in: rect, withAttributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 30)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Here's an updated answer with the following changes:这是一个更新的答案,有以下变化:
draw(at:withAttributes:)
instead of draw(in:withAttributes:)
for centering the text within the resulting UIImagedraw(at:withAttributes:)
而不是draw(in:withAttributes:)
将文本居中放置在生成的 UIImage 中size(withAttributes:)
for having a resulting UIImage of size that correlates to the actual size of the font.size(withAttributes:)
来生成大小与字体实际大小相关的 UIImage。Swift 5斯威夫特5
import UIKit
extension String {
func textToImage() -> UIImage? {
let nsString = (self as NSString)
let font = UIFont.systemFont(ofSize: 1024) // you can change your font size here
let stringAttributes = [NSAttributedString.Key.font: font]
let imageSize = nsString.size(withAttributes: stringAttributes)
UIGraphicsBeginImageContextWithOptions(imageSize, false, 0) // begin image context
UIColor.clear.set() // clear background
UIRectFill(CGRect(origin: CGPoint(), size: imageSize)) // set rect size
nsString.draw(at: CGPoint.zero, withAttributes: stringAttributes) // draw text within rect
let image = UIGraphicsGetImageFromCurrentImageContext() // create image from context
UIGraphicsEndImageContext() // end image context
return image ?? UIImage()
}
}
Swift 3.2斯威夫特3.2
import UIKit
extension String {
func textToImage() -> UIImage? {
let nsString = (self as NSString)
let font = UIFont.systemFont(ofSize: 1024) // you can change your font size here
let stringAttributes = [NSFontAttributeName: font]
let imageSize = nsString.size(attributes: stringAttributes)
UIGraphicsBeginImageContextWithOptions(imageSize, false, 0) // begin image context
UIColor.clear.set() // clear background
UIRectFill(CGRect(origin: CGPoint(), size: imageSize)) // set rect size
nsString.draw(at: CGPoint.zero, withAttributes: stringAttributes) // draw text within rect
let image = UIGraphicsGetImageFromCurrentImageContext() // create image from context
UIGraphicsEndImageContext() // end image context
return image ?? UIImage()
}
}
Updated @Luca Angeletti answer for Swift 3.0.1更新了 Swift 3.0.1 的@Luca Angeletti答案
extension String {
func image() -> UIImage? {
let size = CGSize(width: 30, height: 35)
UIGraphicsBeginImageContextWithOptions(size, false, 0);
UIColor.white.set()
let rect = CGRect(origin: CGPoint(), size: size)
UIRectFill(CGRect(origin: CGPoint(), size: size))
(self as NSString).draw(in: rect, withAttributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 30)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
I really liked @Luca Angeletti solution.我真的很喜欢@Luca Angeletti 解决方案。 I hade the same question as @jonauz about transparent background.
我和 @jonauz 关于透明背景有同样的问题。 So with this small modification you get the same thing but with clear background color.
所以通过这个小的修改,你得到了同样的东西,但背景颜色清晰。
I didn't have the rep to answer in a comment.我没有代表在评论中回答。
import UIKit
extension String {
func emojiToImage() -> UIImage? {
let size = CGSize(width: 30, height: 35)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.clear.set()
let rect = CGRect(origin: CGPoint(), size: size)
UIRectFill(CGRect(origin: CGPoint(), size: size))
(self as NSString).draw(in: rect, withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 30)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Updated version of @Luca Angeletti's answer using UIGraphicsImageRenderer
:使用
UIGraphicsImageRenderer
更新@Luca Angeletti 的答案:
extension String {
func image() -> UIImage? {
let size = CGSize(width: 100, height: 100)
let rect = CGRect(origin: CGPoint(), size: size)
return UIGraphicsImageRenderer(size: size).image { (context) in
(self as NSString).draw(in: rect, withAttributes: [.font : UIFont.systemFont(ofSize: 100)])
}
}
}
Swift 5: ( with optional fontSize, imageSize and bgColor) Swift 5 :( 带有可选的 fontSize、imageSize 和 bgColor)
use it like this:像这样使用它:
let image = "🤣".image()
let imageLarge = "🤣".image(fontSize:100)
let imageBlack = "🤣".image(fontSize:100, bgColor:.black)
let imageLong = "🤣".image(fontSize:100, imageSize:CGSize(width:500,height:100))
import UIKit
extension String
{
func image(fontSize:CGFloat = 40, bgColor:UIColor = UIColor.clear, imageSize:CGSize? = nil) -> UIImage?
{
let font = UIFont.systemFont(ofSize: fontSize)
let attributes = [NSAttributedString.Key.font: font]
let imageSize = imageSize ?? self.size(withAttributes: attributes)
UIGraphicsBeginImageContextWithOptions(imageSize, false, 0)
bgColor.set()
let rect = CGRect(origin: .zero, size: imageSize)
UIRectFill(rect)
self.draw(in: rect, withAttributes: [.font: font])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
This variation is based on @Luca's accepted answer, but allows you to optionally customize the point size of the font, should result in a centered image, and doesn't make the background color white.这种变化基于@Luca接受的答案,但允许您有选择地自定义字体的磅值,应该导致图像居中,并且不会使背景颜色变白。
extension String {
func image(pointSize: CGFloat = UIFont.systemFontSize) -> UIImage? {
let nsString = self as NSString
let font = UIFont.systemFont(ofSize: pointSize)
let size = nsString.size(withAttributes: [.font: font])
UIGraphicsBeginImageContextWithOptions(size, false, 0)
let rect = CGRect(origin: .zero, size: size)
nsString.draw(in: rect, withAttributes: [.font: font])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.