Skip to content

Erzeugen von quadratischen oder runden Miniaturbildern mit Python, Pillow

Python

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

Originalbild - Astronaut

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)

Kissen-Thumbnail in der Mitte quadratisch

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)

Kissen-Miniaturansicht max.  quadratisch

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)

Kopfkissen-Miniaturansicht quadratisch erweitern

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)

Kissen-Thumbnail-Kreis fest

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

Kissen-Thumbnail-Kreis transparent

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)