Schneiden Sie das Bild mit Pythonista auf abgerundete Ecken

Umgebung

iOS 13.3 pythonista3 ver. 3.2

Motivation

Als ich mit Pythonista eine iOS-Startbildschirm-ähnliche App erstellte, wollte ich das Symbolbild auf abgerundete Ecken zuschneiden, also habe ich verschiedene Dinge untersucht.

Verzeichnisaufbau

Es wird davon ausgegangen, dass Sie mit der folgenden Struktur ausführen.

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

Programmkörper

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.')

Über jede Funktion

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.

if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'Der folgende Teil

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.

Nachtrag

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.

Verweise

[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

Schneiden Sie das Bild mit Pythonista auf abgerundete Ecken
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
So beschneiden Sie ein Bild mit Python + OpenCV
Der Weg nach Pythonista
Konvertieren Sie das Bild in .zip mit Python in PDF
Punkt entsprechend dem Bild
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Versuchen Sie, das Bild mit opencv2 zu verwischen
Konvertieren Sie PDF in Image mit ImageMagick
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Berücksichtigen Sie die Verarbeitungsgeschwindigkeit, um den Bildpuffer mit numpy.ndarray zu verschieben
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
HTML-Mail mit Bild zum Senden mit Python
Bildklassifizierung mit Keras-Von der Vorverarbeitung zum Klassifizierungstest-
Bildanzeige mit dem eingebauten ISIGHT
Spielen Sie mit dem UI-Modul von pythonista3
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
[Bilderkennung] Lesen des Ergebnisses der automatischen Annotation mit VoTT
Fügen Sie mit Pythonista Bilder zu iOS-Fotos hinzu
Klicken Sie mit der rechten Maustaste auf das Bild → Realisieren Sie "Mit TinyPNG komprimieren"
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Richten Sie die Farbleiste mit matplotlib an der Figur aus
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
Der Weg zum Kompilieren zu Python 3 mit Thrift
Beispiel für die Wavelet-Konvertierung von Bildern in Python
So veröffentlichen Sie ein Blog auf Amazon S3 mit der statischen Blog-Engine "Pelican" für Pythonista
So zeigen Sie im gesamten Fenster an, wenn Sie das Hintergrundbild mit tkinter einstellen
Ich möchte das Bild entlang der Kontur anstelle des Rechtecks zuschneiden [Python OpenCV]
Wenn Sie mit der Maus über Matplotlib fahren, wird das entsprechende Bild angezeigt.
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Melden Sie sich mit SSH bei einem Remote-Server an
Versuchen Sie, dem Bild die Verzerrung des Fischaugenobjektivs hinzuzufügen
Der einfachste Weg, um mit Django zu beginnen
Konvertieren Sie PDF in Bilder (JPEG / PNG) mit Python
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, die Daten mit Zwietracht zu speichern
Der einfachste Weg, um Stimme mit Python zu synthetisieren
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Geben Sie die ausführbare Python-Datei an, die mit virtualenv verwendet werden soll
Ich wollte mit der Bezier-Kurve spielen
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Begrüßen Sie die Welt mit Python mit IntelliJ
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Bestimmen Sie die Zahlen in dem mit der Webkamera aufgenommenen Bild
Erkennen Sie Ordner mit demselben Bild in ImageHash
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Der einfachste Weg, OpenCV mit Python zu verwenden
Mathematik-Memorandum, um mit dem Feld Nr. 1 Schritt zu halten
Routenführung zum Standort der iPhone-Fotografie mit Pythonista
Einführung in Python mit Atom (unterwegs)
Speichern Sie das Objekt in einer Datei mit pickle
Mathematik-Memorandum, um mit dem Feld Nr. 2 Schritt zu halten
Wie man Kaldi mit JUST Corpus trainiert
Versuchen Sie, Client-FTP mit Pythonista am schnellsten zu machen
Mathematik-Memorandum, um mit dem Feld Nr. 3 Schritt zu halten
Zeigen Sie das Bild nach der Datenerweiterung mit Pytorch an