14

有什麼方法可以用python製作漂亮的圓角?目前我的項目中使用PIL和GD2。他們兩個都有一個arc()方法,可以讓你繪製一個四邊形的圓圈,但四邊形不是反鋸齒的,所以圖像看起來很脆。任何方式來爲python中的圖像製作漂亮的antialiased圓角?

是否有任何干淨的方法來製作抗鋸齒/光滑的圓角?

+0

你會舉一個你得到的角落的例子嗎?順便說一句,我在答覆中增加了更多細節。 – 2009-12-02 13:01:16

+0

就像在你身上的黃色矩形一樣:)不幸的是,他們在照片上看起來很醜。在底部檢查我的答案。並感謝您的幫助。 – DataGreed 2009-12-03 14:12:53

回答

4

所以,好吧,我找到了解決辦法。

我使用超級取樣方法bobince以前提出,但我發現圖像變得模糊。所以,我不會提供完整的代碼,但我會解釋我的解決方案。

它似乎有點白癡,但我還沒有找到任何其他方式來做到這一點,而不涉及任何其他庫。

使用PIL,可以在圖像上繪製白色(或任何需要的顏色,涉及透明的)角點。然後你複製它。您現在應該有兩張帶有非反鋸齒白色圓角的圖像。

現在您應該使用放大 - >縮小超級採樣(請參閱bobince的回答以獲取詳細信息)以使圖像之一平滑(我使用8x縮放)。

現在你有兩個圖像 - 一個角落很脆,另一個角落很平滑,但圖像模糊。

您現在可以在透明的圖像上製作角落,並將整個圖像粘貼在光滑的圖像上。我使用PIL庫中的Image.composite(crispy_image,smooth_image,crispy_image)方法來執行此操作。

瞧!

+0

一個可能的IM實現:使用超級採樣灰度蒙版。在那裏你畫一個白色的圖像,然後你可以縮小它,即使用BICUBIC插值。這應該給你灰色像素的圓角。粘貼這個面具應該也能讓你在最終圖像中找到平滑的角落。 – allo 2017-02-22 22:27:22

16

我通常做的是使用圖像作爲掩模,像這樣的,例如:

border.png

alt text http://nadiana.com/sites/default/files/pil_tutorial/border.png

border = Image.open('border.png') 
source = border.convert('RGB') 
img.paste(source, mask=border) 

掩模可以被調整大小以適合尺寸你要。只要確保使用Image.ANTIALIAS方法。

如果你想在大小更多的控制和半徑可以參考tutorial我寫了前段時間的更多詳細資料(無恥插頭)

,那麼你需要使用弧形或pieslice。我不知道你,但這個圓角矩形我與PIL創建看起來不夠光滑對我說:

alt text http://nadiana.com/sites/default/files/round_rectangle.png

這裏是the code我用來繪製它

也許你應該檢查phatch:http://photobatch.wikidot.com/tutorials它是用Python和PIL編寫的,可以將圓角應用於照片。

alt text

下面是用於應用圓角代碼的鏈接: http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

這也看起來光滑夠我。

+1

白色背景上的黃色矩形 - 不是最簡單的顏色,看看它可能會多麼光滑。 – 2009-12-02 00:02:26

+0

@克雷格,足夠公平:) – 2009-12-02 00:32:19

+0

感謝您的想法,在圓角上覆制。 是的,我需要控制尺寸和半徑,這些角落對我來說並不光滑,因爲我將它們應用於照片。 – DataGreed 2009-12-02 12:10:47

5

您必須要supersample:將弧線繪製成較大的圖像並將其縮小。

例如。白色,順利半透明右下角的16×16邊框,與4x4x方超採樣:

>>> import Image, ImageDraw 
>>> im= Image.new('RGBA', (16*4, 16*4), (255, 255, 255, 0)) 
>>> dr= ImageDraw.ImageDraw(im) 
>>> dr.pieslice((-64, -64, 64, 64), 0, 340, fill=(255,255,255,255)) 
>>> im= im.resize((16, 16), Image.ANTIALIAS) 
>>> im.save('border-se.png') 
+0

這就是我現在使用的,但這種方法使修改後的圖像看起來模糊:( – DataGreed 2009-12-02 10:38:37

+0

我應用角落的照片和照片應該看起來像他們用來+光滑的圓角 – DataGreed 2009-12-02 12:12:16

+0

好吧,然後交換上面的透明度圓所以你將透明白色(255,255,255,0)塗成不透明的白色(255,255,255,255),現在你已經有了一個角落的模板,你可以拿到照片並使用'photoim.paste(cornerim,position,cornerim)把白色的角模板放在照片右下角的頂部,用「transpose()」翻轉模板,然後對每個角落再做一次(如果你需要使輸出透明一點點工作,你必須做一個單獨的完整的面具圖像大小與照片相同,然後粘貼照片和麪具在一起。) – bobince 2009-12-02 16:52:24

0

使用Xiaolin Wu的循環算法,如Graphics Gems II中所述。在這裏可以找到一個簡明的摘要和示例(在php中):http://create.stephan-brumme.com/antialiased-circle/

至於繪製一個圓弧(部分圓),您必須確定給定的點是否在圓弧的角度範圍內,然後繪製它。