Saltar al contenido

PIL Dibujar una superposición cuadrada semitransparente en la imagen

Estate atento porque en este escrito hallarás la respuesta que buscas.Esta noticia ha sido aprobado por nuestros especialistas para garantizar la calidad y veracidad de nuestro post.

Solución:

Lo siento, el comentario que hice acerca de que era un error no era correcto, así que…

Puedes hacerlo creando una imagen temporal y usando Image.alpha_composite() como se muestra en el siguiente código. Tenga en cuenta que admite cuadrados semitransparentes que no sean negros.

from PIL import Image, ImageDraw
from io import BytesIO
from urllib.request import urlopen

TINT_COLOR = (0, 0, 0)  # Black
TRANSPARENCY = .25  # Degree of transparency, 0-100%
OPACITY = int(255 * TRANSPARENCY)

url = "https://i.ytimg.com/vi/W4qijIdAPZA/maxresdefault.jpg"
with BytesIO(urlopen(url).read()) as file:
    img = Image.open(file)
    img = img.convert("RGBA")

# Determine extent of the largest possible square centered on the image.
# and the image's shorter dimension.
if img.size[0] > img.size[1]:
    shorter = img.size[1]
    llx, lly = (img.size[0]-img.size[1]) // 2 , 0
else:
    shorter = img.size[0]
    llx, lly = 0, (img.size[1]-img.size[0]) // 2

# Calculate upper point + 1 because second point needs to be just outside the
# drawn rectangle when drawing rectangles.
urx, ury = llx+shorter+1, lly+shorter+1

# Make a blank image the same size as the image for the rectangle, initialized
# to a fully transparent (0% opaque) version of the tint color, then draw a
# semi-transparent version of the square on it.
overlay = Image.new('RGBA', img.size, TINT_COLOR+(0,))
draw = ImageDraw.Draw(overlay)  # Create a context for drawing things on it.
draw.rectangle(((llx, lly), (urx, ury)), fill=TINT_COLOR+(OPACITY,))

# Alpha composite these two images together to obtain the desired result.
img = Image.alpha_composite(img, overlay)
img = img.convert("RGB") # Remove alpha for saving in jpg format.
img.save('dark-cat.jpg')
img.show()

Aquí está el resultado de aplicarlo a su imagen de prueba:

imagen de un gato con un rectángulo cuadrado ennegrecido superpuesto

Dado que sigo volviendo a este problema cada vez que quiero dibujar un rectángulo transparente con PIL, decidí actualizarlo.

Su código funciona bastante bien para mí si solo cambio una cosa: guarde la imagen en formato PNG en lugar de JPEG.

Así que cuando estoy corriendo

from io import BytesIO
from urllib.request import urlopen
from PIL import Image
from PIL import ImageDraw

url = "https://i.ytimg.com/vi/W4qijIdAPZA/maxresdefault.jpg"
file = BytesIO(urlopen(url).read())
img = Image.open(file)
draw = ImageDraw.Draw(img, "RGBA")
draw.rectangle(((280, 10), (1010, 706)), fill=(200, 100, 0, 127))
draw.rectangle(((280, 10), (1010, 706)), outline=(0, 0, 0, 127), width=3)
img.save('orange-cat.png')

Me sale esta maravillosa imagen:

gato con cuadro delimitador naranja semitransparente

Si solo desea atenuar toda la imagen, hay una manera más simple:

img = Image.eval(img, lambda x: x/2)

Recuerda algo, que te permitimos explicar tu experiencia si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *