¿Cómo se dibujan polígonos semitransparentes con el Python Imaging Library?Dibujando polígonos semitransparentes en PIL
Respuesta
¿Se puede dibujar el polígono en una imagen RGBA separada y luego usar el Image.paste (imagen, caja, máscara) método?
Editar: Esto funciona.
from PIL import Image
from PIL import ImageDraw
back = Image.new('RGBA', (512,512), (255,0,0,0))
poly = Image.new('RGBA', (512,512))
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([(128,128),(384,384),(128,384),(384,128)],
fill=(255,255,255,127),outline=(255,255,255,255))
back.paste(poly,mask=poly)
back.show()
creo @Nick T 's respuesta es buena, pero hay que tener cuidado al usar su código como escrito una imagen de fondo muy grande con, sobre todo en el caso de que se le puede anotando varios polígonos en dicha imagen. Esto es algo que hago al procesar imágenes de satélite enormes con algún código de detección de objetos y anotar las detecciones usando un rectángulo transparente. Para que el código sea eficiente sin importar el tamaño de la imagen de fondo, hago la siguiente sugerencia.
Modificaría la solución para especificar que la imagen de polígono que pegará será tan grande como sea necesario para contener el polígono, no del mismo tamaño que la imagen de fondo. Las coordenadas del polígono se especifican con respecto al cuadro delimitador local, no las coordenadas globales de la imagen. Luego, pegue la imagen del polígono en el desplazamiento en la imagen de fondo más grande.
import Image
import ImageDraw
img_size = (512,512)
poly_size = (256,256)
poly_offset = (128,128) #location in larger image
back = Image.new('RGBA', img_size, (255,0,0,0))
poly = Image.new('RGBA', poly_size)
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([ (0,0), (256,256), (0,256), (256,0)],
fill=(255,255,255,127), outline=(255,255,255,255))
back.paste(poly, poly_offset, mask=poly)
back.show()
Uso de la Image.paste (imagen, caja, máscara) método convertirá el canal alfa en la zona de pegado de la imagen de fondo en el valor de transparencia correspondiente de la imagen polígono.
El método Image.alpha_composite (im1, im2) utiliza el canal alfa de la imagen "pegada" y no convierte el fondo en transparente. Sin embargo, este método necesita dos imágenes de igual tamaño.
- 1. Dibujando polígonos en XML con Android
- 2. ¿Cómo se dibujan polígonos transparentes con Python?
- 3. android/opengles texturas alpha no semitransparentes pero binarias transparentes
- 4. Convierta polígonos en malla
- 5. r puntos en polígonos
- 6. Dibujando círculos con CGContext
- 7. Dibujando texto en .NET
- 8. Dibujando en WriteableBitmap
- 9. Dibujando gráficos en Java
- 10. Dibujando en CGImageRef
- 11. Visual Studio 2010 - Ventanas flotantes semitransparentes
- 12. Operaciones booleanas en polígonos rectangulares
- 13. Ajustar texto en PIL
- 14. ejecutando PIL en 64bit
- 15. Obtener polígonos simples
- 16. polígonos "ajustados" juntos
- 17. Captura de pantalla Incluyendo ventanas semitransparentes en .NET
- 18. Dibujando árboles en Common Lisp
- 19. Dibujando muchas esferas en OpenGL
- 20. Dibujando histograma en OpenCV-Python
- 21. Dibujando líneas 3D en WPF
- 22. Dibujando texto en un lienzo
- 23. Dibujando caracteres Unicode en iPhone
- 24. Dibujando muchos rectángulos en GDI +
- 25. Dibujando y representando árbol de múltiples vías en Python
- 26. Dibujando un botón transparente
- 27. Dibujando triángulos con CUDA
- 28. Dibujando Flame Fractales
- 29. Dibujando esferas con RadialGradientBrush
- 30. Tienda de polígonos GeoJSON en MongoDB