2013-07-24 2 views
1

PIL을 사용하여 너비가 600px에서 2400px까지 200px까지 범위로 조정할 수 있습니다. 이미 Image.ANTIALIAS을 통합했으며 quality=95을 설정하여 최고 품질의 이미지를 얻으실 수 있습니다.PIL : 최상의 화질을 유지하면서 이미지 크기 조정

그러나 축소 된 이미지는 여전히 원본과 비교할 때 품질이 매우 떨어집니다.

가능한 이미지 품질의 정도를 유지하면서 이러한 비율에 따라 이미지의 크기를 조절하는 가장 좋은 방법은 무엇입니까
# Open the original image 
fp = urllib.urlopen(image_path) 
img = cStringIO.StringIO(fp.read()) 
im = Image.open(img) 
im = im.convert('RGB') 

# Resize the image 
resized_image = ImageOps.fit(im, size, Image.ANTIALIAS) 

# Save the image 
resized_image_object = cStringIO.StringIO() 
resized_image.save(resized_image_object, image_type, quality=95) 

:

여기에 내가 사용하고 코드인가?

필자의 주요 목표는 가능한 최대 화질의 이미지를 얻는 것입니다. 프로세스가 얼마나 효율적인지에 대해서는별로 관심이 없습니다.

+0

몇 가지 예를 볼 수 있습니까? 즉 원본 이미지, 스크립트로 축소 된 이미지 및 비교를 위해 Photoshop으로 축소 된 이미지를 만들었습니까? – kindall

+0

일반적으로 결과 이미지의 픽셀 영역을 반복 반복하고 원본 이미지에서 다시 매핑되는 영역을 확인하는 것이 좋습니다. 이것은 회전에 더 중요하지만 완전히 임의적 인 스케일링에도 관련 될 수 있습니다. – Jiminion

+0

PIL이 할 수있는 최선의 코드는 아마도 RGB로 변환하고 ANTIALIAS를 사용하는 코드 일 것입니다. 나는 최근에 ANTIALIAS가 실제로 Lanczos3 알고리즘이라는 것을 발견했습니다. 이것은 꽤 좋은 것으로 간주됩니다. 결과가 부족하다는 것을 아는 것이 궁금합니다. –

답변

1

PIL의 기본 크기 조정 옵션으로 결과를 가져올 수없는 경우 직접 크기 조정 기능을 통해 크기 조정 픽셀 값을 실행하여 크기 조정 픽셀 값을 수동으로 계산할 수 있습니다. 크기 조정 이미지에 대한 세 가지 주요 알고리즘 (내가 아는)이 있습니다

  • 가장 가까운 이웃
  • 이중 선형 보간
  • 바이 큐빅 보간

상기 최고 품질의 이미지를 생성합니다 마지막 하나 가장 긴 계산 시간. 이렇게하려면 작은 이미지의 픽셀 레이아웃을 상상해 보시고 큰 이미지와 일치하도록 크기를 조정하고 새로운 픽셀 위치가 이전 이미지보다 어디에 위치하는지 생각하십시오. 그런 다음 각각의 새 픽셀에 대해 가장 가까운 16 개의 픽셀 (주위의 4x4 반경)의 평균값을 취해이를 새 값으로 사용합니다.

작은 이미지의 각 픽셀에 대한 결과 값은 큰 이미지의 부드럽지만 명확한 크기 조절 된 버전이됩니다. 더 읽기

은 이쪽을 봐 : Wikipedia - Bicubic interpolation

+1

PIL에는 모든 빌트인 BTW가 있습니다. 그러나'Image.ANTIALIAS'는 크기 축소에 권장되는 알고리즘입니다. – kindall

+0

+1 감사합니다. 그래, 이미 Image.ANTIALIAS 알고리즘을 사용하고 있습니다. –

1

는 다른 접근 방식을 시도합니다. 이것이 도움이 될지 확신 할 수 없지만 뒤에서 비슷한 것을 한 것 같습니다. https://stackoverflow.com/a/13211834/1339024

urlpath의 원본 이미지는 그다지 좋은 품질이 아닐 수도 있습니다. 그러나 원한다면 제 스크립트를 사용해보십시오. 주어진 디렉토리에서 이미지를 축소하려고했지만이 부분은 유용 할 수 있습니다.

parentDir = "Some\\Path" 
width = 200 
height = 200 
cdpi = 75 
cquality = 95 
a = Image.open(parentDir+'\\'+imgfile) # Change this to your url type 
iw,ih = a.size 
if iw > width or ih > height: 
    pcw = width/float(iw) 
    pch = height/float(ih) 
    if pcw <= pch: 
     LPC = pcw 
    else: 
     LPC = pch 
    if 'gif' in imgfile: 
     a = a.convert("RGB")#,dither=Image.NONE) 
     a = a.resize((int(iw*LPC),int(ih*LPC)),Image.ANTIALIAS) 
     a = a.convert("P", dither=Image.NONE, palette=Image.ADAPTIVE) 
     a.save(outputDir+"\\"+imgfile,dpi=(cdpi,cdpi), quality=cquality) 
    else: 
     a = a.resize((int(iw*LPC),int(ih*LPC)),Image.ANTIALIAS) 
     a.save(outputDir+"\\"+imgfile,dpi=(cdpi,cdpi), quality=cquality) 
+0

* 레이블을 작성하는 것에 대해 사과드립니다. 잠시 전에 작성했으며,이 약어가 무엇을 의미하는지 완전히 잊어 버렸습니다. pcw와 pch는 Dimension의 PercentChange를 나타내며 (실제로 퍼센트 변화는 아니지만), LPC는 LowestPercentChange (상동)입니다. –

+0

+1 감사합니다. 작동 방식을 확인하는 테스트를 제공합니다. –

+0

@rollingstone 어떻게 작동하는지 알려주십시오. 또한이 문제를 구현하는 데 문제가 있으면 알려 주시기 바랍니다. –

관련 문제