
Mit der Bildverarbeitungsbibliothek Pillow (PIL) von Python können Sie quadratische oder kreisförmige Miniaturansichten erstellen.
Obwohl es im Image-Modul von Pillow eine Methode namens thumbnail() gibt, ändert sie nur die Größe des Bildes, damit es in die angegebene Größe passt.
Dieser Artikel hat folgenden Inhalt.
- Wie man ein rechteckiges Bild quadratisch macht
- Beschneiden Sie ein Quadrat aus einem rechteckigen Bild
- Fügen Sie Polsterung hinzu, um ein Rechteck quadratisch zu machen
- Schneiden Sie ein quadratisches Bild in einem Kreis
- Machen Sie den Hintergrund einfarbig
- Machen Sie den Hintergrund transparent
- Beispielcode für die Stapelverarbeitung
In den folgenden Artikeln finden Sie Informationen zur Installation und einfachen Verwendung von Pillow (PIL).
Importieren Sie Image, ImageDraw und ImageFilter aus PIL. ImageDraw und ImageFilter Werden zum Zeichnen und Verarbeiten von Kreisen used. Beim Erstellen eines quadratischen Miniaturbilds can sie weggelassen Werden.
Importieren Sie für die Stapelverarbeitung os und glob.
Lesen Sie das in den folgenden Beispielen verwendete Bild und bestimmen Sie die Breite (= Höhe) des Miniaturbildes, das Sie schließlich erhalten möchten.
import os
import glob
from PIL import Image, ImageDraw, ImageFilter
im = Image.open('data/src/astronaut_rect.bmp')
thumb_width = 200
Wie man ein rechteckiges Bild quadratisch macht
Da die Größenänderung eines rechteckigen Bildes in einem Quadrat mit resize() ändert des Bildmoduls das Seitenverhältnis, verwenden Sie eine der folgenden Methoden.
- Beschneiden Sie ein Quadrat aus einem rechteckigen Bild
- Fügen Sie Polsterung hinzu, um ein Rechteck quadratisch zu machen
Beschneiden Sie ein Quadrat aus einem rechteckigen Bild
Beschneide einen Bildbereich mit crop().
Definieren Sie eine Funktion zum Zuschneiden des zentralen Bereichs des Bildes.
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))
Anwendungsbeispiel:
im_thumb = crop_center(im, thumb_width, thumb_width)
im_thumb.save('data/dst/astronaut_thumbnail_center_square.jpg', quality=95)
Anstatt den Bereich der Thumbnail-Größe zu beschneiden, can SIE das größte Quadrat (= rechteckiges Quadrat mit kurzer Seite) beschneiden und dann die Größe ändern.
Definieren Sie eine Funktion zum Zuschneiden des größten Quadrats. Es used Eine Funktion, um den mittleren Bereich des Bildes zu beschneiden.
def crop_max_square(pil_img):
return crop_center(pil_img, min(pil_img.size), min(pil_img.size))
Anwendungsbeispiel:
Nachdem aus dem rechteckigen Bild ein Quadrat gemacht wurde, wird die Größe durch resize() auf die Größe des gewünschten Miniaturbildes geändert.
im_thumb = crop_max_square(im).resize((thumb_width, thumb_width), Image.LANCZOS)
im_thumb.save('data/dst/astronaut_thumbnail_max_square.jpg', quality=95)
Fügen Sie Polsterung hinzu, um ein Rechteck quadratisch zu machen
Wenn SIE das gesamte ursprüngliche rechteckige Bild beibehalten möchten, fügen Sie oben, unten, links oder rechts Füllmaterial hinzu, um es quadratisch zu machen.
Mit new() kann ein solides Bild erzeugt und mit paste() eingefügt werden.
Definieren Sie eine Funktion, die Polsterung hinzufügt, um schließlich ein Quadrat mit der Größe der langen Seite des Rechtecks zu werden.
def expand2square(pil_img, background_color):
width, height = pil_img.size
if width == height:
return pil_img
elif width > height:
result = Image.new(pil_img.mode, (width, width), background_color)
result.paste(pil_img, (0, (width - height) // 2))
return result
else:
result = Image.new(pil_img.mode, (height, height), background_color)
result.paste(pil_img, ((height - width) // 2, 0))
return result
Anwendungsbeispiel:
Nachdem aus dem rechteckigen Bild ein Quadrat gemacht wurde, wird es durch resize() auf die Größe des gewünschten Thumbnail-Bildes verkleinert.
im_thumb = expand2square(im, (0, 0, 0)).resize((thumb_width, thumb_width), Image.LANCZOS)
im_thumb.save('data/dst/astronaut_thumbnail_expand.jpg', quality=95)
Schneiden Sie ein quadratisches Bild in einem Kreis
Wenn SIE ein kreisförmiges Miniaturbild erstellen möchten, müssen SIE ein quadratisches Bild zu Einem Kreis zuschneiden.
Es gibt zwei Möglichkeiten:
- Machen Sie den Hintergrund einfarbig (weiß, schwarz usw.)
- den Hintergrund transparent machen (= transparentes PNG machen)
Machen Sie den Hintergrund einfarbig
Verwenden Sie composite(), um zwei Bilder gemäß dem Maskenbild zusammenzusetzen.
Zeichnen Sie einen Kreis und verwenden Sie ihn als Maskenbild. Notebooks zum Zeichnen finden Sie im following Artikel.
Erstellen Sie mit new() ein einfarbiges einfaches Bild der gewünschten Hintergrundfarbe und setzen Sie es mit dem quadratischen Bild mit einer kreisförmigen Maske zusammen.
Der Rand WIRD geglättet, Indem das Maskenbild MIT ImageFilter Weichgezeichnet WIRD. Da sich sterben Fläche des Kreises beim Verwischen ausdehnt, ist es notwendig, zuerst einen kleineren Kreis zu zeichnen.
Definieren Sie sterben folgende Funktion. Geben Sie die Hintergrundfarbe background_color, die Größe des Weichzeichners blur_radius und den Versatz offset an. Keine Unschärfe mit blur_radius=0.
def mask_circle_solid(pil_img, background_color, blur_radius, offset=0):
background = Image.new(pil_img.mode, pil_img.size, background_color)
offset = blur_radius * 2 + offset
mask = Image.new("L", pil_img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))
return Image.composite(pil_img, background, mask)
Anwendungsbeispiel:
im_square = crop_max_square(im).resize((thumb_width, thumb_width), Image.LANCZOS)
im_thumb = mask_circle_solid(im_square, (0, 0, 0), 4)
im_thumb.save('data/dst/astronaut_thumbnail_mask_circle_solid.jpg', quality=95)
Machen Sie den Hintergrund transparent
Verwenden Sie putalpha(), das dem Bild einen Alphakanal hinzufügt.
Der Fluss ist derselbe wie bei der Verwendung eines einfarbigen, einfarbigen Hintergrunds.
def mask_circle_transparent(pil_img, blur_radius, offset=0):
offset = blur_radius * 2 + offset
mask = Image.new("L", pil_img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))
result = pil_img.copy()
result.putalpha(mask)
return result
Transparente Bilder werden mit png gespeichert.
im_square = crop_max_square(im).resize((thumb_width, thumb_width), Image.LANCZOS)
im_thumb = mask_circle_transparent(im_square, 4)
im_thumb.save('data/dst/astronaut_thumbnail_mask_circle_transparent.png')
Beispielcode für die Stapelverarbeitung
Erstellen Sie gemeinsame Miniaturbilder aus Bilddateien in einem beliebigen Verzeichnis (Ordner).
Dies kann auf dieselbe Weise wie eine Batch-Größenänderung durchgeführt werden.
Generieren Sie Miniaturbilder von Bilddateien in src_dir und speichern Sie sie in dst_dir.
src_dir = 'data/temp/src'
dst_dir = 'data/temp/dst'
files = glob.glob(os.path.join(src_dir, '*.jpg'))
for f in files:
im = Image.open(f)
im_thumb = crop_max_square(im).resize((thumb_width, thumb_width), Image.LANCZOS)
ftitle, fext = os.path.splitext(os.path.basename(f))
im_thumb.save(os.path.join(dst_dir, ftitle + '_thumbnail' + fext), quality=95)