Python PIL 0.5 opacity, transparency, alpha
Asked Answered
W

6

19

Is there any way to make an image half transparent?

the pseudo code is something like this:

from PIL import Image
image = Image.open('image.png')
image = alpha(image, 0.5)

I googled it for a couple of hours but I can't find anything useful.

Whipstock answered 14/7, 2014 at 6:55 Comment(2)
Does the answer have to use PIL? I don't believe there is a way of achieving this with that particular module.Gezira
Does reduce_opacity() in this question help?Chaldea
P
30

I realize this question is really old, but with the current version of Pillow (v4.2.1), there is a function called putalpha. It seems to work fine for me. I don't know if will work for every situation where you need to change the alpha, but it does work. It sets the alpha value for every pixel in the image. It seems, though that you can use a mask: http://www.leancrew.com/all-this/2013/11/transparency-with-pil/.

Use putalpha like this:

from PIL import Image
img = Image.open(image)
img.putalpha(127)  # Half alpha; alpha argument must be an int
img.save(dest)
Paginate answered 16/7, 2017 at 15:37 Comment(0)
C
4

Could you do something like this?

from PIL import Image
image = Image.open('image.png') #open image
image = image.convert("RGBA")  #convert to RGBA
rgb = image.getpixel(x,y) #Get the rgba value at coordinates x,y
rgb[3] = int(rgb[3] / 2) or you could do rgb[3] = 50 maybe? #set alpha to half somehow
image.putpixel((x,y), rgb) #put back the modified reba values at same pixel coordinates

Definitely not the most efficient way of doing things but it might work. I wrote the code in browser so it might not be error free but hopefully it can give you an idea.

EDIT: Just noticed how old this question was. Leaving answer anyways for future help. :)

Cause answered 8/6, 2015 at 0:41 Comment(0)
H
2

I put together Pecan's answer and cr333's question from this question:

Using PIL to make all white pixels transparent?

... and came up with this:

from PIL import Image

opacity_level = 170 # Opaque is 255, input between 0-255

img = Image.open('img1.png')
img = img.convert("RGBA")
datas = img.getdata()

newData = []
for item in datas:
    newData.append((0, 0, 0, opacity_level))
else:
    newData.append(item)

img.putdata(newData)
img.save("img2.png", "PNG")

In my case, I have text with black background and wanted only the background semi-transparent, in which case:

from PIL import Image

opacity_level = 170 # Opaque is 255, input between 0-255

img = Image.open('img1.png')
img = img.convert("RGBA")
datas = img.getdata()

newData = []
for item in datas:
    if item[0] == 0 and item[1] == 0 and item[2] == 0:
        newData.append((0, 0, 0, opacity_level))
    else:
        newData.append(item)

img.putdata(newData)
img.save("img2.png", "PNG")
Hogtie answered 6/12, 2015 at 19:8 Comment(0)
T
2

I had an issue, where black boxes were appearing around my image when applying putalpha().

This workaround (applying alpha in a copied layer) solved it for me.

from PIL import Image
with Image.open("file.png") as im:
    im2 = im.copy()
    im2.putalpha(180)
    im.paste(im2, im)
    im.save("file2.png")

Explanation:

Like I said, putalpha modifies all pixels by setting their alpha value, so fully transparent pixels become only partially transparent. The code I posted above first sets (putalpha) all pixels to semi-transparent in a copy, then copies (paste) all pixels to the original image using the original alpha values as a mask. This means that fully transparent pixels in the original image are skipped during the paste.

Tahmosh answered 14/7, 2022 at 16:25 Comment(0)
M
1

This method helps to reduce opacity of logo with transparency before pasting it over image

# pip install Pillow
# PIL.__version__ is 9.3.0

from PIL import Image, ImageEnhance

im = Image.open('logo.png').convert('RGBA')
alpha = im.split()[3]
alpha = ImageEnhance.Brightness(alpha).enhance(.5)
im.putalpha(alpha)
Mori answered 3/12, 2022 at 1:8 Comment(0)
G
0

I just did this by myself...even though my code maybe a little bit weird...But it works fine. So I share it here. Hopes it could help anybody. =)

The idea: To transparent a pic means lower alpha which is the 4th element in the tuple.

my frame code:

from PIL import Image 
img=open(image)
img=img.convert('RGBA')  #you can make sure your pic is in the right mode by check img.mode
data=img.getdata()  #you'll get a list of tuples
newData=[]
for a in data:
    a=a[:3] #you'll get your tuple shorten to RGB
    a=a+(100,) #change the 100 to any transparency number you like between (0,255)
    newData.append(a)
img.putdata(newData) #you'll get your new img ready
img.save(filename.filetype)

I didn't find the right command to fulfil this job automatically, so I write this by myself. Hopes it'll help again. XD

Glittery answered 6/7, 2017 at 11:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.