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:
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:
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ó.