有什麼方法可以用python製作漂亮的圓角?目前我的項目中使用PIL和GD2。他們兩個都有一個arc()
方法,可以讓你繪製一個四邊形的圓圈,但四邊形不是反鋸齒的,所以圖像看起來很脆。任何方式來爲python中的圖像製作漂亮的antialiased圓角?
是否有任何干淨的方法來製作抗鋸齒/光滑的圓角?
有什麼方法可以用python製作漂亮的圓角?目前我的項目中使用PIL和GD2。他們兩個都有一個arc()
方法,可以讓你繪製一個四邊形的圓圈,但四邊形不是反鋸齒的,所以圖像看起來很脆。任何方式來爲python中的圖像製作漂亮的antialiased圓角?
是否有任何干淨的方法來製作抗鋸齒/光滑的圓角?
所以,好吧,我找到了解決辦法。
我使用超級取樣方法bobince以前提出,但我發現圖像變得模糊。所以,我不會提供完整的代碼,但我會解釋我的解決方案。
它似乎有點白癡,但我還沒有找到任何其他方式來做到這一點,而不涉及任何其他庫。
使用PIL,可以在圖像上繪製白色(或任何需要的顏色,涉及透明的)角點。然後你複製它。您現在應該有兩張帶有非反鋸齒白色圓角的圖像。
現在您應該使用放大 - >縮小超級採樣(請參閱bobince的回答以獲取詳細信息)以使圖像之一平滑(我使用8x縮放)。
現在你有兩個圖像 - 一個角落很脆,另一個角落很平滑,但圖像模糊。
您現在可以在透明的圖像上製作角落,並將整個圖像粘貼在光滑的圖像上。我使用PIL庫中的Image.composite(crispy_image,smooth_image,crispy_image)方法來執行此操作。
瞧!
一個可能的IM實現:使用超級採樣灰度蒙版。在那裏你畫一個白色的圖像,然後你可以縮小它,即使用BICUBIC插值。這應該給你灰色像素的圓角。粘貼這個面具應該也能讓你在最終圖像中找到平滑的角落。 – allo 2017-02-22 22:27:22
我通常做的是使用圖像作爲掩模,像這樣的,例如:
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編寫的,可以將圓角應用於照片。
下面是用於應用圓角代碼的鏈接: http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py
這也看起來光滑夠我。
白色背景上的黃色矩形 - 不是最簡單的顏色,看看它可能會多麼光滑。 – 2009-12-02 00:02:26
@克雷格,足夠公平:) – 2009-12-02 00:32:19
感謝您的想法,在圓角上覆制。 是的,我需要控制尺寸和半徑,這些角落對我來說並不光滑,因爲我將它們應用於照片。 – DataGreed 2009-12-02 12:10:47
您必須要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')
這就是我現在使用的,但這種方法使修改後的圖像看起來模糊:( – DataGreed 2009-12-02 10:38:37
我應用角落的照片和照片應該看起來像他們用來+光滑的圓角 – DataGreed 2009-12-02 12:12:16
好吧,然後交換上面的透明度圓所以你將透明白色(255,255,255,0)塗成不透明的白色(255,255,255,255),現在你已經有了一個角落的模板,你可以拿到照片並使用'photoim.paste(cornerim,position,cornerim)把白色的角模板放在照片右下角的頂部,用「transpose()」翻轉模板,然後對每個角落再做一次(如果你需要使輸出透明一點點工作,你必須做一個單獨的完整的面具圖像大小與照片相同,然後粘貼照片和麪具在一起。) – bobince 2009-12-02 16:52:24
使用Xiaolin Wu的循環算法,如Graphics Gems II中所述。在這裏可以找到一個簡明的摘要和示例(在php中):http://create.stephan-brumme.com/antialiased-circle/
至於繪製一個圓弧(部分圓),您必須確定給定的點是否在圓弧的角度範圍內,然後繪製它。
你會舉一個你得到的角落的例子嗎?順便說一句,我在答覆中增加了更多細節。 – 2009-12-02 13:01:16
就像在你身上的黃色矩形一樣:)不幸的是,他們在照片上看起來很醜。在底部檢查我的答案。並感謝您的幫助。 – DataGreed 2009-12-03 14:12:53