web-dev-qa-db-ja.com

Apple Emoji(String)to UIImageへの変換

すべてのApple Emojis。
すべての絵文字を取得して、サイトからコピーすることでStringに入れることができます getemoji 正しい順序の絵文字を画像として

文字列にコピーした絵文字をUIImageに変換する良い方法はありますか?
またはすべてのApple絵文字を正しい順序で取得するためのより良い解決策は?

36
Danny182

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を白い背景色でImage Contextに描画し、最後にUIImageに変換します。

今、あなたは書くことができます

enter image description here

絵文字記号のユニコード値を示す範囲のリストが与えられた

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

範囲のリストが完全であることを保証できません。自分で検索する必要がありますか????

62
Luca Angeletti

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

更新@ 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
    }

}
9
Justin Domnitz

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
Sebbo

以下は、更新された回答と次の変更点です。

  • Centereddraw(at:withAttributes:) の代わりに draw(in:withAttributes:) を使用=結果のUIImage内のテキストを中央揃えにするため
  • 正しいサイズsize(withAttributes:) を使用して、実際のサイズと相関するサイズのUIImageを作成します。フォント。
  • コメント:理解を深めるためにコメントを追加
  • Swiftバージョン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()
    }
}
1
om-ha

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