2008-11-07 16 views
266

이 작업을 수행 할 분명한 방법이 있습니까? 나는 엄지 손톱을 만들려고하고있다.PIL을 사용하여 이미지의 크기를 조정하고 가로 세로 비율을 어떻게 유지합니까?

+7

이 질문은 꽤 오래된하지만 유용하고, 베개 오히려 이것 좀보세요 베개 기반 튜토리얼, 선호하기 때문에 : HTTP : //pillow.readthedocs.org/en/latest/handbook/tutorial.html#create-jpeg-thumbnails – Wtower

+1

이미지 크기를 조정할 수있는 작은 라이브러리를 만들었습니다. 어떤 도움이 될 수 있습니다. https://github.com/ charlesthk/python-resize-image – Charlesthk

답변

326

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

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

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

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 
+58

** [랜디 Syring]에 의해 코멘트 (http://stackoverflow.com/users/182111/randy-syring) ** : 'Image.ANTIALIAS'을'thumbnail()'호출에 추가하십시오. 문서에서 매우 권장되며, 이것이 최상위 답변이므로 모범 사례를 따라야합니다. 즉,'im.thumbnail (size)'를'im.thumbnail (size, Image.ANTIALIAS)'로 대체하십시오. – Anne

+2

필자가 말했듯이이 예제는 pil 문서에서 나온 것이고 예제 (여전히)는 앤티 앨리어스 플래그를 사용하지 않습니다. 아마 대부분의 사람들이 원하는 것이기 때문에, 나는 그것을 추가했다. – gnud

+2

PIL은 새 이미지의 높이를 주어진 크기 (여기서는 128)로 설정하고 가로 세로 비율을 유지하기 위해 너비를 계산합니다. 높이 대신 너비를 고정시키는 방법이 있습니까? 어쩌면 내가 별도의 질문으로이 질문을 할 것이다. – eugene

9

동일한 가로 세로 비율을 유지하려고한다면 원래 크기의 몇 퍼센트 크기로 조정하지 않겠습니까? 예를 들어

절반 원래 크기

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

이미지의 크기가 다양하고 크기 조정 결과가 균일 한 크기 여야합니다. – Steen

136

300 개 픽셀 폭 및 새로운 폭에 비례하는 높이 PIL (파이썬 이미징 라이브러리)를 사용하여 이미지 (somepic.jpg)를 크기를 조절한다이 스크립트 . 이는 300 픽셀이 원래 너비 (img.size [0])의 백분율을 결정한 다음 원래 높이 (img.size [1])에 해당 백분율을 곱하여 결정합니다. "basewidth"를 다른 숫자로 변경하여 이미지의 기본 너비를 변경하십시오.

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

Zope에서이 스크립트를 외부 메서드로 사용하는 경우 네임 스페이스 충돌을 피하기 위해 "PIL 가져 오기 이미지"라는 줄이 필요합니다 Zope의 "Image". – tomvon

+1

감사합니다. PIL.Image.ANTIALIAS' –

+0

이 코드는 0 바이트의 출력 파일'''sompic.jpg''를 얻습니다. 왜 이런 일이 생길까요? 파이썬 3.x를 사용하고 있습니다. –

46

PIL의 축소판 방법은 모든 비율 문제를 제거하므로 사용하는 것이 좋습니다.

한 가지 중요한 힌트하지만 기본적으로

im.thumbnail(size,Image.ANTIALIAS) 

im.thumbnail(size) 

교체, PIL은 좋은 성능 결과 크기를 조정하지만, 낮은 품질의 Image.NEAREST 필터를 사용합니다.

13

PIL 이미 이미지

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

그냥 이미지를 자르면 가로 세로 비율이 유지되지 않습니다. – Radu

1

내 추한 예를자를 수있는 옵션이 있습니다.

함수는 "pic [0-9a-z]. [extension]"과 같은 파일을 가져오고, 120x120 크기로 조정하고, 섹션을 가운데로 이동하고 "ico [0-9a-z]"에 저장합니다.[확장] "세로 및 가로로 작동합니다 @tomvon에 본사를 둔

def imageResize(filepath): 
    from PIL import Image 
    file_dir=os.path.split(filepath) 
    img = Image.open(filepath) 

    if img.size[0] > img.size[1]: 
     aspect = img.size[1]/120 
     new_size = (img.size[0]/aspect, 120) 
    else: 
     aspect = img.size[0]/120 
     new_size = (120, img.size[1]/aspect) 
    img.resize(new_size).save(file_dir[0]+'/ico'+file_dir[1][3:]) 
    img = Image.open(file_dir[0]+'/ico'+file_dir[1][3:]) 

    if img.size[0] > img.size[1]: 
     new_img = img.crop((
      (((img.size[0])-120)/2), 
      0, 
      120+(((img.size[0])-120)/2), 
      120 
     )) 
    else: 
     new_img = img.crop((
      0, 
      (((img.size[1])-120)/2), 
      120, 
      120+(((img.size[1])-120)/2) 
     )) 

    new_img.save(file_dir[0]+'/ico'+file_dir[1][3:]) 
17

, 나는 다음과 같은 사용을 완료 :

크기 조정 폭 :

new_width = 680 
new_height = new_width * height/width 

크기 조절 높이 :

new_height = 680 
new_width = new_height * width/height 

다음으로 :

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

변수가 모두 섞여 있습니다. 게시물의 너비를 조정 한 다음 높이를 조정합니다. 그리고'resize' 호출에서 높이와 너비 모두에 대해'new_width'를 사용하고 있습니까? – Zachafer

+0

@ Zachafer에 대한 수정 제안 – Mohammad

2
from PIL import Image 
from resizeimage import resizeimage 

def resize_file(in_file, out_file, size): 
    with open(in_file) as fd: 
     image = resizeimage.resize_thumbnail(Image.open(fd), size) 
    image.save(out_file) 
    image.close() 

resize_file('foo.tif', 'foo_small.jpg', (256, 256)) 

내가이 라이브러리를 사용

pip install python-resize-image 
8
from PIL import Image 

img = Image.open('/your iamge 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 u want ,*.png,*jpg,*.gif 
관련 문제