14

Piton ile güzel yuvarlak köşeler yapmak için herhangi bir yolu var mı? Şu anda projemde PIL ve GD2 kullanılıyor. Her ikisi de biryöntemine sahiptir, bu size bir çember çizmenize izin verir, ancak çember daire antialiased değil, böylece görüntü gevrek görünüyor.Python'da görüntüler için antialiased yuvarlak köşeler oluşturmanın herhangi bir yolu var mı?

Antialiased/pürüzsüz yuvarlak köşeler yapmak için herhangi bir temiz yol var mı?

border.png maskesi boyutlarına sığacak şekilde yeniden yapılabilir

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) 

:

+0

Aldığınız köşelere bir örnek verir misiniz? Bu arada cevabımla ilgili daha fazla ayrıntı ekledim. –

+0

Cevapladığınız sarı dikdörtgende olduğu gibi :) Maalesef fotoğraflarda çirkin görünüyorlar. Cevabımı altta kontrol et. Ve yardımın için teşekkür ederim. – DataGreed

cevap

4

Yani, tamam, ben bir çözüm buldum.

Daha önce önerilen süper örnekleme yöntemini bobince kullandım, ancak görüntülerin bulanıklaştığını gördüm. Öyleyse, tam kodu sağlamam ama çözümümü açıklayacağım.

Bu çok saçma bir şey gibi görünebilir, ancak başka bir kitaplık içermeden başka bir yol bulamadım.

PIL ile, görüntü üzerinde köşeleri beyaza (veya saydam olanları içeren herhangi bir renk) çizersiniz. Sonra kopyala. Gevrek antialiasız beyaz yuvarlak köşeleri olan iki resminiz olmalıdır.

Artık ölçek-up kullanmalıdır - resimlerden biri pürüzsüz hale getirmek için> süper örnekleme ölçek aşağı (detaylar için yukarıdaki bobince en cevaba bakınız) yöntemini (i 8x ölçeklendirme kullanılır).

Şimdi iki resminiz var - biri gevrek köşeli, diğeri ise pürüzsüz köşeli, ancak bulanık görüntülü.

Artık gevrek görüntülerde köşeleri saydamlaştırmanız ve tüm görüntüyü pürüzsüz olana yapıştırmanız gerekiyor. Bunu yapmak için PIL kütüphanesinde Image.composite (crispy_image, smooth_image, crispy_image) yöntemini kullandım.

Voila!

+0

A olası im progress: Supersampled gri tonlamalı bir maske kullanın. Orada beyaz bir resim çizersiniz ve daha sonra BICUBIC enterpolasyonu ile küçültebilirsiniz. Bu size gri pikselleri olan yuvarlak köşeler vermelidir. Bu maskeyi yapıştırmak, son görüntüde de yumuşak köşeler vermelidir. – allo

16

Ne genellikle yapmak örneğin bunun gibi bir maske olarak bir resim kullanmak olduğunu İstediğiniz. Sadece Image.ANTIALIAS yöntemini kullandığınızdan emin olun. Daha boyutu üzerinde kontrol ve yarıçapı istiyorsanız Sence ben daha ayrıntıları (utanmaz fişi)

için bir süre önce yazdığı tutorial başvurabilirsiniz

o zaman yay ya pieslice kullanmak gerekir. Seni bilmem ama ben PIL ile oluşturulan bu yuvarlatılmış dikdörtgen Bana yeterince pürüzsüz görünür: Burada

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

Ben

Belki Phatch'in kontrol etmelisiniz çizmek için kullanılır the code geçerli: http://photobatch.wikidot.com/tutorials It Python ve PIL'de yazılır ve fotoğraflara yuvarlak köşeler uygulayabilir. Ayrıca bana yeterince pürüzsüz görünüyor http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

: Burada

alt text

yuvarlak köşeler uygulamak için kullanılan koda bir bağlantıdır.

+1

Beyaz zemin üzerine sarı dikdörtgen - ne kadar yumuşak olabileceğini görmek için en kolay renkler değil. –

+0

@Craig, yeterince iyi :) –

+0

Yuvarlak köşeleri kopyalama ile ilgili fikir için teşekkür ederiz. Evet, boyutu ve yarıçapı kontrol etmem gerekiyor ve bu köşeler bana düzgün görünmüyor, çünkü bunları fotoğraflara uyguladım. – DataGreed

5

supersample'a sahip olmanız gerekir: yayı daha büyük bir görüntüye çizmek ve ölçeklendirmek için. Örn.,

örn. 4x4x kare supersampling ile beyaz, düzgün yarı saydam sağ alt 16x16 sınır,:

>>> 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

Şimdi kullandığım budur, ancak bu yöntem değiştirilen görüntü bulanıklaştırır :( – DataGreed

+0

Fotoğraflara köşeler uygulıyorum ve fotoğraflar düzgün yuvarlak köşelerle + – DataGreed

+0

ok gibi görünmeli, ardından yukarıdaki saydamlık turunu değiştirmeli (böylece şeffaf beyazı (255,255,255,0) opak beyaza (255,255,255,255) boyayacaksınız. Artık bir köşe şablonunuz var. Fotoğrafı çekebilir ve fotoim.paste kullanabilirsiniz (köşe, konum, köşe) Beyaz köşe şablonunu fotoğrafın sağ alt kısmına yerleştirmek için 'transpose()' ile şablonu ters çevirin ve her köşesi için tekrar yapın. iş, fotoğraf ile aynı boyutta ayrı bir tam maske resmi yapmak zorunda ve sonra fotoğraf ve maske yapıştırın.) – bobince

0

Grafik Gems II'de açıklandığı gibi Xiaolin Wu'nun daire algoritmasını kullanın. Özlü bir özeti ve örneği (php'de) han şu adreste bulunabilir:

Bir yay çizerken (kısmi daire), belirli bir noktanın çizimi yapmadan önce ark açısal aralığı içinde olup olmadığını belirlemelisiniz.

İlgili konular