[Configuration minimale] Utilisez le module oreiller de python pour synthétiser les caractères "100 yens" avec l'image du thé au lait de Tapioca.

Objectif

Le déclencheur était le menu riche de LINE Bot. C'est un bot que j'ai créé moi-même, mais si vous appuyez sur le menu riche en bas de l'écran, Vous obtiendrez une réponse à la mesure de cela.

MicrosoftTeams-image.png

À propos, le point cette fois est la partie du menu riche. Il s'agit en fait d'une image libre, pas d'un bouton (actuellement, le système LINE semble n'avoir d'autre choix que de l'exprimer sous forme d'image ...).

C'est donc difficile de faire ça. Malheureusement, je n'avais pas une aussi bonne application, alors je l'ai copiée et collée à l'aide de powerpo et de peinture. Je pense que c'est un bon résultat, mais cela a pris du temps. (Ajout: avec une mise à jour récente, vous pouvez facilement la créer sur l'écran des développeurs LINE!)

Alors je pensais: "N'est-ce pas possible avec Python?" Il s'avère qu'il semble possible de le faire avec un module appelé oreiller! Voyons comment le faire tout de suite.

Installation

Si vous utilisez Python, vous le connaissez déjà, mais pour le moment, installez le module.

$ pip install pillow

À propos, l'oreiller semble être un projet de fourchette d'un module appelé PIL. La documentation officielle est ici . Cette fois, j'aimerais faire du traitement d'image principalement en référence à ce document.

Dessiner du texte sur une image existante

Cette fois, je voudrais ajouter "100 yens" à cette image de Tapioca. Passez soudainement du code.

main.py


from PIL import Image, ImageDraw, ImageFont

#Lire l'image originale
image = Image.open("tapioca.png ")

#Puisque l'objet d'écriture de caractères est préparé, récupérez-le
draw = ImageDraw.Draw(image)

#Spécifiez la police (le fichier de police est C si Windows 10:\\Windows\\C'est dans les polices)
#size est la taille des caractères (50 pour le moment)
font = ImageFont.truetype("YuGothL.ttc", size=50)

#Dessiner des lettres
#la première(0,0)Est la position des coordonnées pour commencer à dessiner des caractères, bien sûr(10,10)Etc. sont OK
#fill détermine la couleur des caractères avec RVB
draw.text((0, 0), "100 yens", fill=(255,0,0), font=font)

#Enregistrer l'image
image.save("new_tapioca.png ")

Il s'est avéré être quelque chose comme ça. new_sample.png

Application (centrage, etc.)

Je jouerai avec l'arrangement des lettres. Pour autant que j'ai vu la documentation, j'avais une telle option, mais pour une raison quelconque, cela ne fonctionnait pas, alors j'ai pensé à une façon primitive de le faire.

Essayez d'obtenir la taille de l'image

main.py



from PIL import Image, ImageDraw, ImageFont

#Lire l'image originale
image = Image.open("tapioca.png ")

#Obtenez la taille de l'image
print(image.size[0]) # =>771 dans cet exemple
print(image.size[1]) # =>856 dans cet exemple

Vous connaissez maintenant la taille maximale.

Commencez à dessiner à partir du centre de l'image entière

Si les 771 et 856 ci-dessus sont définis sur la position de départ du dessin, il commencera à partir du coin inférieur droit de l'image et vous pouvez à peine voir les caractères spéciaux. Maintenant, divisez 771 et 856 par 2 et utilisez cette position comme position de départ. Cela devrait commencer à dessiner à partir du centre de l'image.

new_sample.png

Je le savais bien, mais ça ressemble à ça. Le point de départ est certes au milieu de l'image, mais ce n'est pas comme ça ...

De plus, la taille de la zone de dessin de «100 yens» est acquise et l'endroit est retiré de moitié.

Le titre est un peu difficile à comprendre, mais je veux aligner le centre de "100 yens" avec le centre de l'image entière. En d'autres termes, il peut être réalisé en obtenant la taille lorsque "100 yens" est tiré et en retournant ensuite le point de départ de la moitié de la taille de "100 yens". Eh bien, c'est difficile à mettre en mots.

Je vais l'essayer pour le moment. Tout d'abord, j'ai pu obtenir la taille de "100 yens" en dessous.

from PIL import Image, ImageDraw, ImageFont

#Lors de la lecture de l'image originale
image = Image.open("tapioca.png ")

#Puisque l'objet d'écriture de caractères est préparé, récupérez-le
draw = ImageDraw.Draw(image)

#Décidez de la police
font = ImageFont.truetype("YuGothL.ttc", size=50)

#Obtenez la taille de "100 yens"
draw_text_width, draw_text_height = draw.textsize("100 yens", font=font)

Tout d'abord, après avoir défini le point de départ du dessin de "100 yens" comme partie centrale de l'image d'origine Tirez vers le haut et à gauche de la moitié de la taille de ce draw_text_width et draw_text_height. Considérez-le comme une continuation du code ci-dessus.

draw.text(((image.size[0] / 2 - draw_text_width / 2), (image.size[1] / 2 - draw_text_height / 2)), "100 yens", fill=(255, 0, 0), font=font)

C'est long et difficile à comprendre. Cela peut être plus facile à comprendre.

start_X_point = image.size[0] / 2 - draw_text_width / 2
start_Y_point = image.size[1] / 2 - draw_text_height / 2

draw.text((start_X_point, start_Y_point), "100 yens", fill=(255, 0, 0), font=font)

Code d'achèvement

main.py


from PIL import Image, ImageDraw, ImageFont

#Lors de la lecture de l'image originale
image = Image.open("tapioca.png ")

#Puisque l'objet d'écriture de caractères est préparé, récupérez-le
draw = ImageDraw.Draw(image)

#Décidez de la police
font = ImageFont.truetype("YuGothL.ttc", size=50)

#Obtenez la taille des personnages que vous souhaitez dessiner
draw_text_width, draw_text_height = draw.textsize("100 yens", font=font)

#Déterminez les coordonnées du point de départ du dessin en fonction de la taille des caractères que vous souhaitez dessiner et de la taille de l'image d'origine
start_X_point = image.size[0] / 2 - draw_text_width / 2
start_Y_point = image.size[1] / 2 - draw_text_height / 2

#dessiner
draw.text((start_X_point, start_Y_point), "100 yens", fill=(255, 0, 0), font=font)

#Enregistrez l'image finie
image.save("new_tapioca.png ")

J'étais heureux de l'apporter au centre.

new_sample.png

Résumé

-Image et texte peuvent être facilement combinés avec Pillow! ・ Il est facile de synthétiser, mais le centrage peut être un peu gênant. (Autant que j'ai lu le document, j'ai la possibilité de centrer, mais pour une raison quelconque, cela ne fonctionne pas ...)

Recommended Posts

[Configuration minimale] Utilisez le module oreiller de python pour synthétiser les caractères "100 yens" avec l'image du thé au lait de Tapioca.
J'ai essayé de trouver l'entropie de l'image avec python
Connaissances minimales pour démarrer avec le module de journalisation Python
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Le moyen le plus simple de synthétiser la voix avec python
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Utilisez Pillow pour rendre l'image transparente et en superposer une partie seulement
Le moyen le plus simple d'utiliser OpenCV avec python
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Une note de malentendu lors de la tentative de chargement de l'intégralité du module self-made avec Python3
Comment utiliser Raspeye Relay Module Python
Convertissez l'image au format .zip en PDF avec Python
Utilisons la version Python du module API Confluence.
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Pourquoi puis-je utiliser le module en important avec python?
Facilitez la compréhension de l'affichage des exceptions du module Python
[Python] Je souhaite utiliser l'option -h avec argparse
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Récupérez la source de la page à charger indéfiniment avec python.
[Python] J'ai essayé de visualiser le prix en argent de "ONE PIECE" plus de 100 millions de caractères avec matplotlib.
Que faire lorsqu'une partie de l'image d'arrière-plan devient transparente lorsque l'image transparente est combinée avec Oreiller
Activé pour convertir PNG en JPG avec Pillow of Python
[Version septembre 2020] Explique la procédure d'utilisation de l'API Gmail avec Python
Je veux sortir le début du mois prochain avec Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
Exemple à utiliser après l'authentification OAuth de l'API BOX avec Python
Considérez la vitesse de traitement pour déplacer le tampon d'image avec numpy.ndarray
[Python] Explique comment utiliser la fonction format avec un exemple
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
L'histoire de la création d'un module qui ignore le courrier avec python
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
Python: comment utiliser async avec
Comment utiliser le module optparse
Comment utiliser le module ConfigParser
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
[Python] Explique comment utiliser la fonction range avec un exemple concret
Utilisez python sur Raspberry Pi 3 pour éclairer la LED avec le contrôle du commutateur!
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
[Reconnaissance d'image] Comment lire le résultat de l'annotation automatique avec VoTT
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
[Python] Comment utiliser la liste 2 Référence de la valeur de la liste, nombre d'éléments, valeur maximale, valeur minimale
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
[Introduction à Python] Quelle est la méthode de répétition avec l'instruction continue?
GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.
Essayez de mesurer la position d'un objet sur le bureau (système de coordonnées réel) à partir de l'image de la caméra avec Python + OpenCV