2013-07-24 58 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個最近像素(其周圍4×4半徑)的平均值並將其用作其新值。

小圖像中每個像素的結果值將是平滑但清晰的大圖像大小版本。

進一步的閱讀看看這裏: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代表百分比變化百分比(雖然不是百分比變化),而LPC是LowestPercentChange(同上)。 –

+0

+1謝謝,會給這個測試看看它是如何工作的。 –

+0

@rollingstone讓我知道它是如何工作的。此外,如果您在執行此操作時遇到問題,請隨時通知我。 –

相關問題