Search code examples
pythonpython-3.ximagepython-imaging-library

PIL - How to overlay an image with a transparent background?


I decided to experiment a bit with the new PIL library. But during the experiment, a problem arose - you need a monotonous background ... For example, this one

...overlay a wave image with a TRANSPARENT background ...

I tried to do it like this:

from PIL import Image
import random as rm

bodyColorListDir = 'C:/Users/Home/Documents/neutral-cubes/body-color/'

bodyColor_list = ['1.png', '2.png', '3.png', '4.png', '5.png', '6.png', '7.png', 
'8.png', '9.png', '10.png', '11.png', '12.png', '13.png', '14.png', '15.png', 
'16.png', '17.png', '18.png', '19.png', '20.png', '21.png', '22.png', '23.png', 
'24.png', '25.png', '26.png', '27.png', '28.png', '29.png', '30.png', '31.png', 
'32.png', '33.png', '34.png', '35.png', '36.png', '37.png', '38.png', '39.png', 
'40.png', '41.png', '42.png', '43.png', '44.png', '45.png', '46.png', 'secret.png']

wave_img = "C:/Users/Home/Downloads/imgonline-com-ua-Resize-jjS2xs50sS04g.png"

wave_number = 0

for bodyColor in bodyColor_list:
    wave_number += 1

    img = Image.open(bodyColorListDir + bodyColor)
    wave = Image.open(wave_img)
    img.save('C:/Users/Home/Documents/neutral-cubes/tempes/wave' + str(wave_number) + '.png')`

However, this results in the images being saved with only the original background.
How to fix it?

I also tried this code:

from PIL import Image
import random as rm

bodyColorListDir = 'C:/Users/Home/Documents/neutral-cubes/body-color/'

bodyColor_list = ['1.png', '2.png', '3.png', '4.png', '5.png', '6.png', '7.png', 
'8.png', '9.png', '10.png', '11.png', '12.png', '13.png', '14.png', '15.png', 
'16.png', '17.png', '18.png', '19.png', '20.png', '21.png', '22.png', '23.png', 
'24.png', '25.png', '26.png', '27.png', '28.png', '29.png', '30.png', '31.png', 
'32.png', '33.png', '34.png', '35.png', '36.png', '37.png', '38.png', '39.png', 
'40.png', '41.png', '42.png', '43.png', '44.png', '45.png', '46.png', 'secret.png']

wave_img = "C:/Users/Home/Downloads/imgonline-com-ua-Resize-jjS2xs50sS04g.png"

wave_number = 0

for bodyColor in bodyColor_list:
    wave_number += 1

    img = Image.open(bodyColorListDir + bodyColor)
    wave = Image.open(wave_img)
    Image.Image.paste(wave, None, (1000, 1000), None)
    img.save('C:/Users/Home/Documents/neutral-cubes/tempes/wave' + str(wave_number) + '.png')`

But this did not work either, moreover, an error appeared:

Traceback (most recent call last):
  File "C:\Users\Home\PycharmProjects\mainProject\KiGAN.py", line 17, in <module>
    Image.Image.paste(wave, None, (1000, 1000), None)
  File "C:\Users\Home\PycharmProjects\mainProject\venv\Lib\site-packages\PIL\Image.py", line 1644, in paste
    raise ValueError("cannot determine region size; use 4-item box")
ValueError: cannot determine region size; use 4-item box

Solution

  • You have to convert your image in RGBA mode ( because you have a foreground with transparent zones) I centered the foreground image, too.

    from PIL import Image
    
    bodyColorListDir = './'
    bodyColor_list = ['1.png']
    wave_img = "./wave.jpg"
    wave_number = 0
    
    for bodyColor in bodyColor_list:
        wave_number += 1
        
        # Load background image
        img = Image.open(bodyColorListDir + bodyColor)
        # Convert image to RGBA
        img = img.convert("RGBA")
        
        # Load foreground image
        wave = Image.open(wave_img)
        # Convert image to RGBA
        wave = wave.convert("RGBA")
        
        # Find the point where paste the foreground. 
        # coordinates can be negative if foreground size is larger than background
        img_width=img.width
        img_height=img.height
        wave_width=wave.width
        wave_height=wave.height
        position_paste=(int((img_width-wave_width)/2),int((img_height-wave_height)/2))
        
        # Paste the frontImage at (width, height)
        img.paste(wave, position_paste, wave)
    
        # Save the image
        img.save("./wave" + str(wave_number) + ".png")
    

    orange wave Result