640 Stimmen

Wie kann ich die Größe eines Bildes mit PIL ändern und das Seitenverhältnis beibehalten?

Gibt es eine offensichtliche Möglichkeit, dies zu tun, die ich übersehe? Ich versuche nur, Miniaturansichten zu erstellen.

5voto

RockOGOlic Punkte 150

Ich werde auch eine Version der Größenänderung hinzufügen, die das Seitenverhältnis beibehält. In diesem Fall wird die Höhe so angepasst, dass sie der Breite des neuen Bildes entspricht, basierend auf dem ursprünglichen Seitenverhältnis, Asp_ratte das ist Schwimmer (!). Um jedoch die Breite an die Höhe anzupassen, müssen Sie nur eine Zeile auskommentieren und die andere in der Datei sonst Schleife. Sie werden sehen, wo.

Sie brauchen die Semikolons (;) nicht, ich behalte sie nur, um mich an die Syntax von Sprachen zu erinnern, die ich häufiger verwende.

from PIL import Image

img_path = "filename.png";
img = Image.open(img_path);     # puts our image to the buffer of the PIL.Image object

width, height = img.size;
asp_rat = width/height;

# Enter new width (in pixels)
new_width = 50;

# Enter new height (in pixels)
new_height = 54;

new_rat = new_width/new_height;

if (new_rat == asp_rat):
    img = img.resize((new_width, new_height), Image.ANTIALIAS); 

# adjusts the height to match the width
# NOTE: if you want to adjust the width to the height, instead -> 
# uncomment the second line (new_width) and comment the first one (new_height)
else:
    new_height = round(new_width / asp_rat);
    #new_width = round(new_height * asp_rat);
    img = img.resize((new_width, new_height), Image.ANTIALIAS);

# usage: resize((x,y), resample)
# resample filter -> PIL.Image.BILINEAR, PIL.Image.NEAREST (default), PIL.Image.BICUBIC, etc..
# https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize

# Enter the name under which you would like to save the new image
img.save("outputname.png");

Und, es ist geschafft. Ich habe versucht, es so gut wie möglich zu dokumentieren, damit es klar ist.

Ich hoffe, dass es für jemanden da draußen hilfreich sein könnte!

5voto

user391339 Punkte 7577

Öffnen Sie Ihre Bilddatei

from PIL import Image
im = Image.open("image.png")

PIL-Methode Image.resize(size, resample=0) verwenden , wobei Sie (Breite, Höhe) Ihres Bildes durch das 2er-Tupel Größe ersetzen.

Dadurch wird Ihr Bild in Originalgröße angezeigt:

display(im.resize((int(im.size[0]),int(im.size[1])), 0) )

Dadurch wird Ihr Bild in der Hälfte der Größe angezeigt:

display(im.resize((int(im.size[0]/2),int(im.size[1]/2)), 0) )

Dadurch wird Ihr Bild in 1/3 der Größe angezeigt:

display(im.resize((int(im.size[0]/3),int(im.size[1]/3)), 0) )

Dadurch wird Ihr Bild in 1/4 der Größe angezeigt:

display(im.resize((int(im.size[0]/4),int(im.size[1]/4)), 0) )

usw. usw.

4voto

noEmbryo Punkte 2002

Ich habe versucht, die Größe einiger Bilder für ein Diashow-Video zu ändern, und deshalb wollte ich nicht nur eine maximale Größe, sondern eine maximale Breite et eine maximale Höhe (die Größe des Videobildes).
Und es gab immer die Möglichkeit eines Porträtvideos...
Die Image.thumbnail Methode war vielversprechend, aber ich konnte sie nicht dazu bringen, ein kleineres Bild hochzuskalieren.

Nachdem ich also keine offensichtliche Möglichkeit gefunden habe, dies hier (oder an anderen Stellen) zu tun, habe ich diese Funktion geschrieben und sie hier für alle anderen zur Verfügung gestellt:

from PIL import Image

def get_resized_img(img_path, video_size):
    img = Image.open(img_path)
    width, height = video_size  # these are the MAX dimensions
    video_ratio = width / height
    img_ratio = img.size[0] / img.size[1]
    if video_ratio >= 1:  # the video is wide
        if img_ratio <= video_ratio:  # image is not wide enough
            width_new = int(height * img_ratio)
            size_new = width_new, height
        else:  # image is wider than video
            height_new = int(width / img_ratio)
            size_new = width, height_new
    else:  # the video is tall
        if img_ratio >= video_ratio:  # image is not tall enough
            height_new = int(width / img_ratio)
            size_new = width, height_new
        else:  # image is taller than video
            width_new = int(height * img_ratio)
            size_new = width_new, height
    return img.resize(size_new, resample=Image.LANCZOS)

4voto

Kanish Mathew Punkte 705

Habe die obige Antwort von "tomvon" aktualisiert.

from PIL import Image

img = Image.open(image_path)

width, height = img.size[:2]

if height > width:
    baseheight = 64
    hpercent = (baseheight/float(img.size[1]))
    wsize = int((float(img.size[0])*float(hpercent)))
    img = img.resize((wsize, baseheight), Image.ANTIALIAS)
    img.save('resized.jpg')
else:
    basewidth = 64
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), Image.ANTIALIAS)
    img.save('resized.jpg')

3voto

Ich habe die Größe des Bildes so angepasst und es funktioniert sehr gut.

from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
import os, sys
from PIL import Image

def imageResize(image):
    outputIoStream = BytesIO()
    imageTemproaryResized = imageTemproary.resize( (1920,1080), Image.ANTIALIAS) 
    imageTemproaryResized.save(outputIoStream , format='PNG', quality='10') 
    outputIoStream.seek(0)
    uploadedImage = InMemoryUploadedFile(outputIoStream,'ImageField', "%s.jpg" % image.name.split('.')[0], 'image/jpeg', sys.getsizeof(outputIoStream), None)

    ## For upload local folder
    fs = FileSystemStorage()
    filename = fs.save(uploadedImage.name, uploadedImage)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X