Подтвердить что ты не робот

Преобразование Apple Emoji (String) в UIImage

Мне нужно все Apple Emojis.
Я могу получить все emojis и поместить их в String, скопировав их с сайта getemoji но в моем приложении мне нужен emojis в правильном порядке как изображения.

Есть ли хороший способ конвертировать emojis, который я копирую в String, в UIImage?
Или лучшее решение для того, чтобы получить все эмуляторы Apple в правильном порядке?

4b9b3361

Ответ 1

Обновлено для Swift 4.1

Добавьте это расширение в ваш проект

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
    }
}

Приведенный выше код рисует текущую String в контексте изображения с белым фоновым цветом и, наконец, преобразует его в UIImage.

Теперь вы можете написать

enter image description here

пример

Приведен список диапазонов, указывающих Unicode-значения символов Emoji

let ranges = [0x1F601...0x1F64F, 0x2702...0x27B0]

Вы можете превратить его в список изображений

let images = ranges
    .flatMap { $0 }
    .compactMap { Unicode.Scalar($0) }
    .map(Character.init)
    .compactMap { String($0).image() }

Результат:

enter image description here

Я не могу гарантировать, что список диапазонов полон, вам нужно искать его самостоятельно 😉

Ответ 2

То же самое для 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
    }
}

Ответ 3

Обновленный ответ @Luca Angeletti для Swift 3.0.1

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
    }

}

Ответ 4

Swift 4.2

Мне очень понравилось решение @Luca Angeletti. У меня такой же вопрос, как у @jonauz, о прозрачном фоне. Так что с этой небольшой модификацией вы получите то же самое, но с чистым цветом фона.

У меня не было представителя, чтобы ответить в комментарии.

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
    }
}

Ответ 5

Здесь обновленный ответ со следующими изменениями:

  • По центру: использовал draw(at:withAttributes:) вместо draw(in:withAttributes:) для центрирования текста в результирующем UIImage
  • Правильный размер: Используемый size(withAttributes:) для получения результирующего UIImage размера, который соответствует фактическому размеру шрифта.
  • Комментарии: Добавлены комментарии для лучшего понимания
  • Swift Version 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()
    }
}

Ответ 6

Обновленная версия ответа UIGraphicsImageRenderer с использованием UIGraphicsImageRenderer:

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)])
        }
    }
}