First, your image/surface needs to use per-pixel alpha, therefore call the convert_alpha() method when you load it. If you want to create a new surface (as in the example), you can also pass pygame.SRCALPHA to pygame.Surface.
The second step is to create another surface (called alpha_surface here) which you fill with white and the desired alpha value (the fourth element of the color tuple).
Finally, you have to blit the alpha_surface onto your image and pass pygame.BLEND_RGBA_MULT as the special_flags argument. That will make the opaque parts of the image translucent.
import pygame as pg pg.init() screen = pg.display.set_mode((800, 600)) clock = pg.time.Clock() BLUE = pg.Color('dodgerblue2') BLACK = pg.Color('black') # Load your image and use the convert_alpha method to use # per-pixel alpha. # IMAGE = pygame.image.load('circle.png').convert_alpha() # A surface with per-pixel alpha for demonstration purposes. IMAGE = pg.Surface((300, 300), pg.SRCALPHA) pg.draw.circle(IMAGE, BLACK, (150, 150), 150) pg.draw.circle(IMAGE, BLUE, (150, 150), 130) alpha_surface = pg.Surface(IMAGE.get_size(), pg.SRCALPHA) # Fill the surface with white and use the desired alpha value # here (the fourth element). alpha_surface.fill((255, 255, 255, 90)) # Now blit the transparent surface onto your image and pass # BLEND_RGBA_MULT as the special_flags argument. IMAGE.blit(alpha_surface, (0, 0), special_flags=pg.BLEND_RGBA_MULT) done = False while not done: for event in pg.event.get(): if event.type == pg.QUIT: done = True screen.fill((50, 50, 50)) pg.draw.rect(screen, (250, 120, 0), (100, 300, 200, 100)) screen.blit(IMAGE, (150, 150)) pg.display.flip() clock.tick(60) pg.quit()
circle.png, the background where you are drawing it and a third image showing how you want it to look. A picture's worth a thousand words, so 3 pictures will save you lots of writing.