2012-03-27 72 views
1

我需要的是: - 有兩個圖像:背景(大)和圖像(較小) - 在背景上有一個斜線框,我想在其中合併輪廓PIC粘貼兩個文件後圖像質量較差

代碼:

# open the profile pic 
im = PIL.Image.open(pic) 
# resize it to dim of oblique box 
im = im.resize((picX, picY)) 

# this is the degree of oblique box 
degree = 13.67 

# open the background 
bg = PIL.Image.open(bgsrc) 
bgosize = bg.size 
bginfo = bg.info 


# first, I rotate the background to be paralell with profile pic 
bg = bg.rotate(-degree, resample = PIL.Image.BILINEAR, expand = True) 

# paste the profile pic to background 
bg.paste(im, (px1, py1, px2, py2)) 

# rotate back to original orientation 
bg = bg.rotate(degree, resample = PIL.Image.BILINEAR, expand = False) 


# crop the rotated image, because it's greater than original size, 
# after first rotate - coords are stored 
bg.crop(bgx1, bgy1, bgx2, bgy2) 

PIL.ImageFile.MAXBLOCK = bg.size[0] * bg.size[1] 
bg.save(dst, quality = 250, optimize = True, **bginfo) 

這個變換後的結果圖像是nubbly一個litlebit ...

我怎樣才能得到一個良好的育人質量的圖像?

感謝:

a。

回答

3

提示1:使用Image.BICUBIC而不是Image.BILINEAR。不幸的是rotate不接受Image.ANTIALIAS這將提供更好的結果。提示2:不要旋轉背景並稍後將其旋轉,請旋轉要粘貼的圖像。

提示3:以'L'格式創建一個純白色圖像,並且尺寸與您粘貼的圖像相同。以同樣的方式旋轉它。將它用作paste的掩碼參數。


我沒有測試過這段代碼,但它應該可以工作。有一個問題, quality = 250應該完成什麼?例如, JPEG options只接受1到95的值。

# open the profile pic 
im = PIL.Image.open(pic) 
# resize it to dim of oblique box 
im = im.resize((picX, picY), PIL.Image.ANTIALIAS) 

# this is the degree of oblique box 
degree = 13.67 

# open the background 
bg = PIL.Image.open(bgsrc) 
bgosize = bg.size 
bginfo = bg.info 

# create a copy of the profile that is all white 
mask = PIL.Image.new('L', im.size, 0xff) 

# rotate the profile and the mask 
im = im.rotate(degree, resample = PIL.Image.BICUBIC, expand = True) 
mask = mask.rotate(degree, resample = PIL.Image.BICUBIC, expand = True) 

# paste the profile pic to background 
bg.paste(im, (px1, py1, px2, py2), mask) 

PIL.ImageFile.MAXBLOCK = bg.size[0] * bg.size[1] 
bg.save(dst, quality = 250, optimize = True, **bginfo) 
+0

嗨馬克,感謝您的回覆, 1:我試過BILINEAR也是 - 它沒有效果。 2:如果我首先旋轉輪廓圖片,它將調整到更大的尺寸,黑色背景 - 如何將JPEG轉換/變換爲不透明的PNG? 3:我會檢查掩碼參數,如果你有一個例子,我感謝你:) – airween 2012-03-27 18:19:32

+0

嗨馬克,謝謝你的例子。 如果我在im.rotate和mask.rotate之後即時保存圖像,那麼它們也是非常重要的...因此,即使我打開背景並從PIL中保存它,它也會一目瞭然。 我的另一個評論:當cr對象(而不是im)被遮罩時,它具有黑色背景 - 我如何創建透明背景?非常感謝: – airween 2012-03-28 08:36:19

1

嘗試雙三次插值?如果沒有幫助,請嘗試使圖像變大(例如,2倍甚至4倍大小),然後旋轉,然後縮小至原始尺寸。

+0

我試過 - 沒有改變。更大的圖像不是解決方案,因爲個人資料圖片將來自用戶 - 我不能(不希望)期待更大的圖像。 – airween 2012-03-27 18:15:27

+0

@airween,我認爲他的建議是調整大小,旋轉,調整回原來的大小。 – 2012-03-27 18:21:11

+0

Ahm',所以,對不起,我誤解了 - 好吧,我會檢查出來,謝謝。 – airween 2012-03-27 18:31:13