web-dev-qa-db-fra.com

Convertir Apple Emoji (String) en UIImage

J'ai besoin de tous les Apple Emojis.
Je peux obtenir tous les emojis et les mettre dans une String en les copiant depuis le site getemoji mais dans mon application j'ai besoin des emojis dans le bon ordre sous forme d'images .

Existe-t-il un bon moyen de convertir les emojis que je copie en une chaîne en un UIImage?
Ou une meilleure solution pour obtenir tous les Apple emojis dans le bon ordre?

36
Danny182

Mis à jour pour Swift 4.1

Ajoutez cette extension à votre projet

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

Le code ci-dessus dessine le String actuel dans un contexte d'image avec une couleur de fond blanc et le transforme finalement en UIImage.

Vous pouvez maintenant écrire

enter image description here

Exemple

Étant donné une liste de plages indiquant les valeurs unicode des symboles emoji

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

vous pouvez le transformer en une liste d'images

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

Résultat:

enter image description here

Je ne peux pas garantir que la liste des gammes est complète, vous devrez la rechercher par vous-même ????

62
Luca Angeletti

Même chose pour 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

Mise à jour @ Luca Angeletti réponse pour 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

J'ai vraiment aimé la solution @Luca Angeletti. Je hade la même question que @jonauz sur le fond transparent. Donc, avec cette petite modification, vous obtenez la même chose mais avec une couleur d'arrière-plan claire.

Je n'ai pas eu le représentant pour répondre dans un commentaire.

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

Voici une réponse mise à jour avec les modifications suivantes:

  • Centré : utilisé draw(at:withAttributes:) au lieu de draw(in:withAttributes:) = pour centrer le texte dans l'image UII résultante
  • Taille correcte : utilisé size(withAttributes:) pour avoir un UIImage de taille résultant qui correspond à la taille réelle de la police.
  • Commentaires : Ajout de commentaires pour une meilleure compréhension
  • Version 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

Version mise à jour de la réponse de @Luca Angeletti en utilisant 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)])
        }
    }
}
1
imas145