iOS 13.3 pythonista3 ver. 3.2
Als ich mit Pythonista eine iOS-Startbildschirm-ähnliche App erstellte, wollte ich das Symbolbild auf abgerundete Ecken zuschneiden, also habe ich verschiedene Dinge untersucht.
Es wird davon ausgegangen, dass Sie mit der folgenden Struktur ausführen.
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):
#Zeichne ein abgerundetes Quadrat[3]Beziehen auf. Es ist eher eine Kopie.
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:
#Dieser Fehler tritt auf, weil er keine ist, wenn keine Auswahl getroffen wird
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)
Es ist eine Kopie von Site in Referenz [1].
make(pil_img, r=100, fil=True)
pil_img: PIL-Bildobjekt r: Radius des abgerundeten Kreises? ?? fil: Vorhandensein oder Nichtvorhandensein eines Filters. Sie brauchen es vielleicht nicht.
Basierend auf der mask_circle_transparent-Funktion von Site-sama in Referenz [2] wird die Maske vereinfacht und gerundet.
DrawBack(img, r=100) img: PIL-Bildobjekt r: Radius des abgerundeten Kreises?
Dies ist eine Funktion des Programms von Site in Referenz [3]. Um ein quadratisches Bild zu erstellen, das als Symbolbild bezeichnet wird, werden rx und ry mit gleichen Werten verwendet.
iconGenerate(iconpath, r=100) iconpath: Pfad zum Speicherort des Bildes, das Sie verwenden möchten r: Radius des abgerundeten Kreises?
Der Hauptteil dieses Programms.
im = Image.open(iconpath)
newname = ''.join(['../icons/', str(pathlib.Path(iconpath).stem), '.PNG'])
thumb_width = 300
Erstellen Sie zunächst ein PIL-Bildobjekt aus dem Pfad und legen Sie einen Sicherungsnamen fest. Beim Erstellen eines Path-Objekts mit pathlib.Path (iconpath) extrahiert stem nur den Dateinamen (ohne Erweiterung) aus dem Pfad. Ich besetze es mit str und verbinde es mit join.
thumb_width bestimmt die Länge einer Seite des Quadrats. Die auf den Sites [1] und [2] verwendeten Variablennamen werden unverändert verwendet.
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 schneidet das Bild auf ein Quadrat. Siehe [1] und [2]. Die Ecken sind mit im_thumb bedeckt. Anschließend wird das Bild gespeichert und zurückgegeben.
Ich denke, es ist ein Slapstick, aber ich werde das Verhalten erklären, wenn das gesamte Programm kopiert und betrieben wird.
temp = pathlib.Path('../icons')
for p in temp.iterdir():
print('・' + p.name)
Der Pfad der Datei am Speicherort wird vom Pfadobjekt generiert, und die Dateien in diesem Ordner werden aufgelistet. isfin ist eine Variable, die die while-Schleife bei True beendet.
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:
#Dieser Fehler tritt auf, weil er keine ist, wenn keine Auswahl getroffen wird
print('Nothing chosen.')
continue
Wählen Sie anhand der Liste das Bild aus, das als Nächstes angewendet werden soll.
Wenn Sie direkt aus der Foto-App auswählen, geben Sie new ein.
Wenn Sie neu eingeben, wird das Foto angezeigt. Es wird möglicherweise nur angezeigt, wenn es sich um ein kürzlich gespeichertes Foto handelt. Im Allgemeinen
asset = photos.pick_asset(title='Pick a image', multi=False)
try:
image = asset.get_image()
except AttributeError:
print('Nothing chosen.')
image.save(path)
Sie können das Bild unter dem vom Programm angegebenen Pfad speichern.
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
Konvertiert das Bild mit dem eingegebenen Dateinamen und speichert es. Es wird nach der Konvertierung in die Konsole mit im.show () angezeigt. (Bestätigung) Fragen Sie danach, ob Sie erneut konvertieren möchten, und wenn Sie etwas anderes als n beantworten, gelangen Sie erneut in die while-Schleife.
Wenn Sie Fehler mit diesem Programm haben, hinterlassen Sie bitte einen Kommentar. Ist es nicht besser, dies in Bezug auf die Lesbarkeit zu tun? Bitte kommentieren Sie auch aktiv wie! Ich bin nicht sehr gut darin, daher würde ich gerne Ihr Feedback hören.
[1] Trimmen eines Teils des Bildes mit Python, Pillow (Zuschneiden / Zuschneiden) [2] Erstellen Sie mit Python und Pillow gleichzeitig quadratische und kreisförmige Miniaturbilder [3] Informationen zur Bildverarbeitung: Zeichnen Sie mit Pillow abgerundete Quadrate
Recommended Posts