[python] PIL을 사용하여 이미지 크기를 조정하고 종횡비를 유지하려면 어떻게합니까?

내가 누락 된 확실한 방법이 있습니까? 미리보기 이미지를 만들려고합니다.



답변

최대 크기를 정의하십시오. 그런 다음을 사용하여 크기 조정 비율을 계산하십시오 min(maxwidth/width, maxheight/height).

적절한 크기는 oldsize*ratio입니다.

물론 이것을 수행하는 라이브러리 메소드가 있습니다 : method Image.thumbnail.
아래는 PIL 문서 의 (편집 된) 예입니다 .

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size, Image.ANTIALIAS)
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for '%s'" % infile


답변

이 스크립트는 PIL (Python Imaging Library)을 사용하여 이미지 (somepic.jpg)의 크기를 300 픽셀의 너비와 새 너비에 비례하는 높이로 조정합니다. 300 픽셀이 원래 너비 인 비율 (img.size [0])을 결정한 다음 원래 높이 (img.size [1])에 해당 백분율을 곱하면됩니다. 이미지의 기본 너비를 변경하려면 “기준 너비”를 다른 숫자로 변경하십시오.

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('sompic.jpg') 


답변

또한 PIL의 썸네일 방법을 사용하는 것이 좋습니다. 왜냐하면 모든 비율 번거 로움을 제거하기 때문입니다.

그러나 한 가지 중요한 힌트 : 바꾸기

im.thumbnail(size)

im.thumbnail(size,Image.ANTIALIAS)

기본적으로 PIL은 크기 조정을 위해 Image.NEAREST 필터를 사용하여 성능은 좋지만 품질은 떨어집니다.


답변

@tomvon을 기반으로 다음 사용을 마쳤습니다 (사례 선택).

a) 높이 조정 ( 새 너비를 알고 있으므로 새 높이가 필요합니다 )

new_width  = 680
new_height = new_width * height / width 

b) 너비 조정 크기 ( 새 높이를 알고 있으므로 새 너비가 필요합니다 )

new_height = 680
new_width  = new_height * width / height

그런 다음 :

img = img.resize((new_width, new_height), Image.ANTIALIAS)


답변

PIL에는 이미 이미지를 자르는 옵션이 있습니다

img = ImageOps.fit(img, size, Image.ANTIALIAS)


답변

from PIL import Image

img = Image.open('/your image path/image.jpg') # image extension *.png,*.jpg
new_width  = 200
new_height = 300
img = img.resize((new_width, new_height), Image.ANTIALIAS)
img.save('output image name.png') # format may what you want *.png, *jpg, *.gif


답변

동일한 종횡비를 유지하려는 경우 원래 크기의 일정 비율로 크기를 조정하지 않습니까?

예를 들어, 원래 크기의 절반

half = 0.5
out = im.resize( [int(half * s) for s in im.size] )