Coupez l'image aux coins arrondis avec pythonista

environnement

iOS 13.3 pythonista3 ver. 3.2

Motivation

Lorsque je créais une application de type écran d'accueil iOS avec pythonista, je voulais couper l'image de l'icône aux coins arrondis, j'ai donc recherché diverses choses.

Structure du répertoire

On suppose que vous exécutez avec la structure suivante.

root/  ├ icons/  └ exe/    └ iconEditor.py

Organisme du programme

iconEditor.py



from PIL import Image, ImageDraw, ImageFilter
import photos
import pathlib

def crop_center(pil_img, crop_width, crop_height):
	img_width, img_height = pil_img.size
	return pil_img.crop((
		(img_width - crop_width) // 2,
		(img_height - crop_height) // 2,
		(img_width + crop_width) // 2,
		(img_height + crop_height) // 2
		))

def crop_max_square(pil_img):
	return crop_center(pil_img, min(pil_img.size), min(pil_img.size))

def make(pil_img, r=100, fil=True):
	mask = DrawBack(pil_img, r)
	if fil:
		mask = mask.filter(ImageFilter.SMOOTH)
	result = pil_img.copy()
	result.putalpha(mask)

	return result


def DrawBack(img, r=100):
	#Dessinez un carré arrondi[3]Faire référence à. C'est plutôt presque une copie.
	mask = Image.new("L", img.size, 0)
	draw = ImageDraw.Draw(mask)
	rx = r
	ry = r
	fillcolor = "#ffffff"
	draw.rectangle((0,ry)+(mask.size[0]-1,mask.size[1]-1-ry), fill=fillcolor)
	draw.rectangle((rx,0)+(mask.size[0]-1-rx,mask.size[1]-1), fill=fillcolor)
	draw.pieslice((0,0)+(rx*2,ry*2), 180, 270, fill=fillcolor)
	draw.pieslice((0,mask.size[1]-1-ry*2)+(rx*2,mask.size[1]-1), 90, 180, fill=fillcolor)
	draw.pieslice((mask.size[0]-1-rx*2,mask.size[1]-1-ry*2)+
	(mask.size[0]-1,mask.size[1]-1), 0, 180, fill=fillcolor)
	draw.pieslice((mask.size[0]-1-rx*2,0)+
	(mask.size[0]-1,ry*2), 270, 360, fill=fillcolor)
	return mask

	
def iconGenerate(iconpath, r=100):
	im = Image.open(iconpath)
	
	newname = ''.join(['../icons/', str(pathlib.Path(iconpath).stem), '.PNG'])
	thumb_width = 300

	im_square = crop_max_square(im).resize((thumb_width, thumb_width), Image.LANCZOS)
	im_thumb = make(im_square, r, False)
	im_thumb.save(newname)
	return im_thumb
	
if __name__ == '__main__':
	temp = pathlib.Path('../icons')
	for p in temp.iterdir():
		print('・' + p.name)
	
	isfin = False
	while not(isfin):
		print('which file?(if new, input new)')
		fname = input()
		
		if fname == 'new':
			asset = photos.pick_asset(title='Pick a image', multi=False)
			try:
				image = asset.get_image()
				print('Input new name with .png or .PNG')
				newname = input('newname : ')
				image.save('../icons/'+newname)
				fname = newname
				
			except AttributeError:
				#Cette erreur se produit car il n'y en a aucune si aucune sélection n'est effectuée
				print('Nothing chosen.')
				continue
			
		try:
			r = int(input('r : '))
			im = iconGenerate('../icons/'+fname, r)
			print('Success!')
			im.show()
			isfin = True

		except Exception as e:
			print(e)
			print('Some Error Occored')

		print('Exit?(y / n)')
		ans = input()
		isfin = False if ans == 'n' else True
		## End while
	print('Exit this file.')

À propos de chaque fonction

crop_center(pil_img, crop_width, crop_height) crop_max_square(pil_img)

Il s'agit d'une copie de Site dans la référence [1].

make(pil_img, r=100, fil=True)

pil_img: objet image PIL r: Rayon du cercle arrondi? ?? fil: Présence ou absence de filtre. Vous n'en aurez peut-être pas besoin.

Basé sur la fonction mask_circle_transparent de Site dans Reference [2], le masque est simplifié et arrondi.

DrawBack(img, r=100) img: objet image PIL r: Rayon du cercle arrondi?

Il s'agit d'une version fonctionnalisée du programme de Site dans la référence [3]. Pour faciliter la création d'une image carrée appelée image d'icône, rx et ry avec des valeurs égales sont utilisés.

iconGenerate(iconpath, r=100) iconpath: chemin vers l'emplacement de stockage de l'image que vous souhaitez utiliser r: Rayon du cercle arrondi?

La partie principale de ce programme.


im = Image.open(iconpath)
	
newname = ''.join(['../icons/', str(pathlib.Path(iconpath).stem), '.PNG'])
thumb_width = 300

Tout d'abord, créez un objet image PIL à partir du chemin et choisissez un nom de sauvegarde. En créant un objet Path avec pathlib.Path (iconpath), stem extrait uniquement le nom de fichier (sans extension) du chemin. Je le lance avec str et le rejoins avec join.

thumb_width détermine la longueur d'un côté du carré. Les noms de variables utilisés sur les sites [1] et [2] sont utilisés tels quels.


im_square = crop_max_square(im).resize((thumb_width, thumb_width), Image.LANCZOS)
im_thumb = make(im_square, r, False)

im_thumb.save(newname)
return im_thumb

im_square recadre l'image en carré. Voir [1] et [2]. Les coins sont recouverts de im_thumb. Ensuite, je l'enregistre et je renvoie l'image.

if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'La partie suivante

Je pense que c'est un slapstick, mais je vais expliquer le comportement lorsque tout le programme est copié et exploité.


temp = pathlib.Path('../icons')
for p in temp.iterdir():
	print('・' + p.name)

Le chemin du fichier à l'emplacement d'enregistrement est généré par l'objet Path et les fichiers de ce dossier sont répertoriés. isfin est une variable qui termine la boucle while lorsque True.


if fname == 'new':
			asset = photos.pick_asset(title='Pick a image', multi=False)
			try:
				image = asset.get_image()
				print('Input new name with .png or .PNG')
				newname = input('newname : ')
				image.save('../icons/'+newname)
				fname = newname
				
			except AttributeError:
				#Cette erreur se produit car il n'y en a aucune si aucune sélection n'est effectuée
				print('Nothing chosen.')
				continue

Sélectionnez l'image à appliquer ensuite en vous référant à la liste.

Si vous choisissez directement depuis l'application Photos, saisissez nouveau.

Si vous entrez nouveau, la photo sera affichée. Elle peut ne pas s'afficher à moins qu'il ne s'agisse d'une photo récemment enregistrée. En général


asset = photos.pick_asset(title='Pick a image', multi=False)
try:
	image = asset.get_image()

except AttributeError:
	print('Nothing chosen.')

image.save(path)

Vous pouvez enregistrer l'image dans le chemin spécifié par le programme.


r = int(input('r : '))
im = iconGenerate('../icons/'+fname, r)
print('Success!')
im.show()
isfin = True

print('Exit?(y / n)')
ans = input()
isfin = False if ans == 'n' else True

Convertit l'image avec le nom de fichier saisi et l'enregistre. Il sera affiché après la conversion vers la console avec im.show (). (Vérification) Après cela, demandez si vous voulez convertir à nouveau, et si vous répondez autre chose que n, vous entrerez à nouveau dans la boucle while.

Postscript

Si vous rencontrez des bogues lors de l'utilisation de ce programme, veuillez laisser un commentaire. N'est-il pas préférable de faire cela en termes de lisibilité? Veuillez également commenter activement comme! Je ne suis pas très bon dans ce domaine, alors j'aimerais avoir vos commentaires.

Les références

[1] Découpage d'une partie de l'image avec Python, Pillow (crop / crop) [2] Créez des images miniatures carrées et circulaires à la fois avec Python et Pillow [3] À propos du traitement d'image: dessinez des carrés arrondis à l'aide de Pillow

Recommended Posts

Coupez l'image aux coins arrondis avec pythonista
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Comment recadrer une image avec Python + OpenCV
La route vers Pythonista
Convertissez l'image au format .zip en PDF avec Python
Point selon l'image
J'ai essayé de trouver l'entropie de l'image avec python
Essayez de brouiller l'image avec opencv2
Convertir un PDF en image avec ImageMagick
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
Considérez la vitesse de traitement pour déplacer le tampon d'image avec numpy.ndarray
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
mail html avec image à envoyer avec python
Classification d'image avec Keras - Du prétraitement au test de classification -
Affichage de l'image prise avec l'ISIGHT intégré
Ajustez le module ui de pythonista3
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
[Reconnaissance d'image] Comment lire le résultat de l'annotation automatique avec VoTT
Ajouter des images à des photos iOS avec Pythonista
Faites un clic droit sur l'image → Réalisez "Compresser avec TinyPNG"
J'ai essayé de jouer avec l'image avec Pillow
Alignez la barre de couleurs sur la figure avec matplotlib
Essayez de générer une image avec aliénation
La route de la compilation vers Python 3 avec Thrift
Exemple de conversion en ondelettes d'images en Python
Comment publier un blog sur Amazon S3 avec le moteur de blog statique `` Pélican '' pour Pythonista
Comment afficher dans toute la fenêtre lors de la définition de l'image d'arrière-plan avec tkinter
Je veux recadrer l'image le long du contour au lieu du rectangle [python OpenCV]
Lorsque vous passez la souris sur Matplotlib, l'image correspondante s'affiche.
Essayez de résoudre le problème du fizzbuzz avec Keras
J'ai essayé de "lisser" l'image avec Python + OpenCV
Connectez-vous à un serveur distant avec SSH
Essayez d'ajouter la distorsion de l'objectif fisheye à l'image
Le moyen le plus simple de démarrer avec Django
Convertir un PDF en image (JPEG / PNG) avec Python
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé de sauvegarder les données avec discorde
Le moyen le plus simple de synthétiser la voix avec python
Essayez de résoudre le diagramme homme-machine avec Python
Spécifiez le fichier exécutable Python à utiliser avec virtualenv
Je voulais jouer avec la courbe de Bézier
Comment essayer l'algorithme des amis d'amis avec pyfof
Dites bonjour au monde avec Python avec IntelliJ
J'ai essayé de corriger la forme trapézoïdale de l'image
Déterminez les nombres dans l'image prise avec la webcam
Détecter les dossiers avec la même image dans ImageHash
J'ai essayé de "binariser" l'image avec Python + OpenCV
Le moyen le plus simple d'utiliser OpenCV avec python
Mémorandum de mathématiques pour suivre le domaine # 1
Guidage d'itinéraire vers l'emplacement de photographie iPhone avec Pythonista
Introduction à Python avec Atom (en route)
Enregistrer l'objet dans un fichier avec pickle
Mémorandum de mathématiques pour suivre le domaine # 2
Comment entraîner Kaldi avec JUST Corpus
Essayez de rendre le client FTP le plus rapide avec Pythonista
Mémorandum de mathématiques pour suivre le champ # 3
Afficher l'image après l'augmentation des données avec Pytorch