14

¿Hay alguna manera de hacer buenas curvas con Python? Actualmente, PIL y GD2 se usan en mi proyecto. Ambos tienen un método arc(), que le permite dibujar un círculo de quater, pero el círculo de quater no tiene antialias, por lo que la imagen se ve crujiente.¿Alguna manera de hacer bonitas esquinas redondas antialias para las imágenes en python?

¿Hay alguna manera ordenada de hacer esquinas redondas antialiased/smooth?

+0

¿Podría dar un ejemplo de las esquinas que está recibiendo? Agregué más detalles a mi respuesta por cierto. –

+0

Lo mismo que en el rectángulo amarillo en su respuesta :) Se ven feas en las fotos, desafortunadamente. Verifique mi respuesta en la parte inferior. Y gracias por tu ayuda. – DataGreed

Respuesta

4

Así, de acuerdo, i encontró la solución.

Utilicé el método de supermuestreo bobince propuesto anteriormente, pero encontré que las imágenes se vuelven borrosas. Por lo tanto, no proporcionaría el código completo, pero explicaré mi solución.

Puede parecer un poco idiotizante, pero no he encontrado ninguna otra forma de hacerlo sin involucrar ninguna otra biblioteca.

Con PIL, dibuja las esquinas blancas (o el color que necesite, con las transparentes) en la imagen. Luego, cópialo. Ahora debería tener dos imágenes con esquinas redondeadas blancas no antialias crujientes.

Ahora se debe utilizar escalado -> supersampling escala hacia abajo (ver respuesta de bobince arriba) método para hacer una de las imágenes suaves (i utilizado 8x escala).

Ahora tiene dos imágenes: una con esquinas crujientes y otra con esquinas suaves, pero con una imagen borrosa.

Ahora tiene que hacer que las esquinas de la imagen crujiente sean transparentes y pegar toda la imagen en la lisa. Usé el método Image.composite (crispy_image, smooth_image, crispy_image) en la biblioteca PIL para hacer esto.

Voila!

+0

Un posible im provement: use una máscara de escala de grises supersampled. Allí dibuja una imagen blanca y luego puede reducirla, es decir, con una interpolación BICUBIC. Esto debería darle esquinas redondeadas con píxeles grises. Pegar esta máscara también debería darle esquinas suaves en la imagen final. – allo

16

Lo que suelo hacer es utilizar una imagen como una máscara, como éste, por ejemplo:

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) 

La máscara puede cambiar de tamaño para adaptarse a las dimensiones usted quiere. Solo asegúrate de usar el método Image.ANTIALIAS.

Se puede hacer referencia a la tutorial que escribí hace un tiempo para más detalles (enchufe descarado)

Si desea más control sobre el tamaño y el radio a continuación, es necesario utilizar arco o PieSlice. No sé ustedes, pero este rectángulo redondeado que creé con PIL se ve lo suficientemente suave para mí:

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

Aquí es the code Solía ​​dibujar

Tal vez usted debe comprobar Phatch: Se http://photobatch.wikidot.com/tutorials está escrito en Python y PIL y puede aplicar esquinas redondas a las fotos.

alt text

Aquí hay un enlace al código usado para aplicar las esquinas redondas: http://bazaar.launchpad.net/~stani/phatch/trunk/annotate/head:/phatch/actions/round.py

Eso también se ve lo suficientemente suave para mí.

+1

Rectángulo amarillo sobre fondo blanco: no es el color más fácil para ver qué tan suave podría ser. –

+0

@Craig, es suficiente :) –

+0

Gracias por la idea de copiar en esquinas redondas. Sí, necesito controlar el tamaño y el radio, y estas esquinas no me parecen suaves, porque las aplico a las fotos. – DataGreed

5

Tendrá que supersample: dibujar el arco a una imagen más grande y reducirla.

por ejemplo. a, borde blanco sin problemas semi-transparente inferior derecha 16x16, con 4x4x supersampling cuadrado:

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

Eso es lo que uso ahora, pero este método hace que la imagen modificada se vea borrosa :( – DataGreed

+0

Aplico esquinas a las fotos y las fotos deben verse como si fueran + con esquinas redondeadas lisas – DataGreed

+0

OK, luego cambie la transparencia en el cuadro anterior (por lo que está pintando de blanco transparente (255,255,255,0) en blanco opaco (255,255,255,255). Ahora tiene una galería de símbolos de esquina. Puede obtener la foto y usar 'photoim.paste (cornerim, position, cornerim)' para poner la galería de símbolos blanca en la esquina superior derecha de la foto. Da la vuelta a la plantilla con 'transpose()' y vuelve a hacer para cada esquina (si necesitas hacer la salida transparente, eso es un poco más) trabajo, tendrías que hacer una imagen de máscara completa por separado del mismo tamaño que la foto y luego pegar la foto y la máscara juntas.) – bobince

0

Usa el algoritmo del círculo de Xiaolin Wu como se describe en Graphics Gems II. Puede encontrar un resumen conciso y un ejemplo (en php) aquí: http://create.stephan-brumme.com/antialiased-circle/

Al dibujar un arco (círculo parcial), debe determinar si un punto dado se encuentra dentro del rango angular del arco antes de trazarlo.

Cuestiones relacionadas