iOS 13.3 pythonista3 ver. 3.2
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.
On suppose que vous exécutez avec la structure suivante.
root/ ├ icons/ └ exe/ └ iconEditor.py
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.')
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.
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.
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.
[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