Python PIL 0.5 opacity, transparency, alpha

2019-04-08 23:38发布

问题:

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.

回答1:

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(128)  # Half alpha; alpha argument must be an int
img.save(dest)


回答2:

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



回答3:

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


回答4:

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