Streifenbilder erzeugen mit Python

by

in

Die Idee von diesem Programm ist, bestehende Bilder in Streifen zu zerschneiden und dann wieder zufällig zusammenzusetzen.

Original

Nach der Bearbeitung

Hier können noch mehr Beispiele gefunden werden

Um dies zu erreichen, öffnet das Programm zunächst das Bild und berechnet dann die Breite und Höhe des Bildes.

Anschliessend wird das Bild in die vorgegebene Anzahl an Streifen zerschnitten, entweder in horizontaler oder vertikaler Richtung.

Danach werden die Streifen in zufälliger Reihenfolge wieder zusammengesetzt und ein neues Bild erstellt.

Das Programm erzeugt dann einen eindeutigen Dateinamen und speichert das neue Bild.

Python
import PIL import Image
import random
import uuid

def horizontal_strips (img, width, height, num_strips):

    # Calculate the strip height
    strip_height = int(height/num_strips)

    strips = []
    for i in range(num_strips):
        # Get the current strip
        box = (0, i*strip_height, width, (i+1)*strip_height)
        strip = img.crop(box)
        strips.append(strip)

    return strip_height, strips


def vertical_strips (img, width, height, num_strips):

    # Calculate the strip width
    strip_width = int(width/num_strips)

    strips = []
    for i in range(num_strips):
        # Get the current strip
        box = (i*strip_width, 0, (i+1)*strip_width, height)
        strip = img.crop(box)
        strips.append(strip)

    return strip_width, strips

def main(inFile, num_strips, direction):
    try:
        # Open the image
        img = Image.open(inFile)    
    except:
        print("Something went wrong when opening the file: ", inFile) 

    # Get the height and width of the image
    width, height = img.size

    if (direction == "h"):
        strip_dim, strips = horizontal_strips (img, width, height, num_strips)
    else:
        strip_dim, strips = vertical_strips (img, width, height, num_strips)

    # Shuffle the strips
    random.shuffle(strips)

    # Reassemble the image
    reassembled_img = Image.new('RGB', (width, height))

    # for i in range num_strips:
    offset = 0
    for strip in strips:
        if (direction == "h"):
            reassembled_img.paste(strip, (0, offset))
        else:
            reassembled_img.paste(strip, (offset, 0))

        offset += strip_dim

    # make Filename
    id = str(uuid.uuid4())
    # Save the reassembled image
    reassembled_img.save(f'reassembled_image-{id}.jpg')

if __name__ == "__main__":
    # ------- Init -------
    inFile = "berg.jpg" # Filename of input File 
    num_strips = 12     # Define the number of strips
    direction = "v"     # corp direction h = horizontal or v = vertical

    main(inFile, num_strips, direction)