How can I make the background of a surface transparent in pygame
In pygame I draw a figure on a Surface. I want the Surface itself to be transparent but the image visible. I've tried to use set_alpha
on the Surface, but the figure itself stays transparent.
self.original_image = Surface((self.rect.w, self.rect.h))
self.original_image.set_alpha(0)
pg.draw.polygon(self.original_image,
self.color,
[Vector2(gui.PATCH_SIZE, gui.PATCH_SIZE),
Vector2(gui.HALF_PATCH_SIZE( ), 0),
Vector2(0, gui.PATCH_SIZE),
Vector2(gui.HALF_PATCH_SIZE( ), gui.PATCH_SIZE*3/4),
])
self.image = self.original_image
When I draw it I see nothing. When I leave out self.original_image.set_alpha(0)
I get the figure I want, but on a black background rectangle, which obscures whatever it is over. I get the same result if I try self.original_image.fill((0, 0, 0, 0))
instead of self.original_image.set_alpha(0)
. Any suggestions would be appreciated. Thanks.
P.S. I'm trying to draws a NetLogo standard "Turtle."
Asked by: Grace734 | Posted: 30-11-2021
Answer 1
Example fill background with green color and then it draw surface with red rectangle/poligon.
First uses convert_alpha()
, next fill with fill([0,0,0,0])
, and you can draw.
In this version you can use colors [R,G,B,Alpha]
to set different transparency for every pixel. But you can't uses set_alpha(128)
to change transparency for all pixels at one.
import pygame
# --- constants --- (UPPER_CASE_NAMES)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 25
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# --- main ---
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
surface = pygame.surface.Surface(screen.get_size()).convert_alpha()
surface.fill([0,0,0,0])
pygame.draw.polygon(surface, RED, [(100,100), (200,200), (300,100)])
clock = pygame.time.Clock()
running = True
while running:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYUP:
if event.key == pygame.K_ESCAPE:
running = False
# --- draws ---
screen.fill(GREEN)
screen.blit(surface, (0,0))
pygame.display.flip()
# --- FPS ---
ms = clock.tick(FPS)
#pygame.display.set_caption('{}ms'.format(ms)) # 40ms for 25FPS, 16ms for 60FPS
fps = clock.get_fps()
pygame.display.set_caption('FPS: {}'.format(fps))
# --- end ---
pygame.quit()
OR
Use set_colorkey([0,0,0])
and blit()
will not copy pixels with color [0,0,0]
.
In this version you can use set_alpha(128)
to set the same transparency for all pixels but you can't uses colors [R,G,B,Alpha]
to set different transparency for every pixel separatelly.
import pygame
# --- constants --- (UPPER_CASE_NAMES)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 25 # for more than 220 it has no time to update screen
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# --- main ---
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
surface = pygame.surface.Surface(screen.get_size())
surface.set_colorkey([0,0,0]) # don't copy color [0,0,0] on screen
pygame.draw.polygon(surface, RED, [(100,100), (200,200), (300,100)])
clock = pygame.time.Clock()
running = True
while running:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYUP:
if event.key == pygame.K_ESCAPE:
running = False
# --- draws ---
screen.fill(GREEN)
#surface.set_alpha(128)
screen.blit(surface, (0,0))
pygame.display.flip()
# --- FPS ---
ms = clock.tick(FPS)
#pygame.display.set_caption('{}ms'.format(ms)) # 40ms for 25FPS, 16ms for 60FPS
fps = clock.get_fps()
pygame.display.set_caption('FPS: {}'.format(fps))
# --- end ---
pygame.quit()
EDIT:
import pygame
# --- constants --- (UPPER_CASE_NAMES)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 25 # for more than 220 it has no time to update screen
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255,255,0)
# --- main ---
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
# ---
background = pygame.surface.Surface(screen.get_size())
color = (128,128,128)
for x in range(0, SCREEN_WIDTH, 40):
for y in range(0, SCREEN_HEIGHT, 40):
pygame.draw.rect(background, color, [x,y,40,40])
if color == (128,128,128):
color = (192,192,192)
else:
color = (128,128,128)
# ---
surface = pygame.surface.Surface(screen.get_size())
surface.set_colorkey([0,0,0]) # don't copy color [0,0,0] on screen
pygame.draw.polygon(surface, RED, [(100,100), (200,200), (300,100)])
pygame.draw.polygon(surface, GREEN, [(100,300), (200,200), (300,300)])
pygame.draw.polygon(surface, BLUE, [(100,100), (200,200), (100,300)])
pygame.draw.polygon(surface, YELLOW, [(300,100), (200,200), (300,300)])
surface.set_alpha(128) # semi transparent all pixels
# --- mainloop ---
clock = pygame.time.Clock()
running = True
while running:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYUP:
if event.key == pygame.K_ESCAPE:
running = False
# --- draws ---
screen.blit(background, (0,0))
screen.blit(surface, (0,0))
pygame.display.flip()
# --- FPS ---
ms = clock.tick(FPS)
#pygame.display.set_caption('{}ms'.format(ms)) # 40ms for 25FPS, 16ms for 60FPS
fps = clock.get_fps()
pygame.display.set_caption('FPS: {}'.format(fps))
# --- end ---
pygame.quit()
Answered by: Sarah242 | Posted: 01-01-2022
Similar questions
python - How to make a surface with a transparent background in pygame
Can someone give me some example code that creates a surface with a transparent background in pygame?
python - How to make a surface with a transparent background in pygame
Can someone give me some example code that creates a surface with a transparent background in pygame?
django - python PIL - background displayed opaque instead of transparent
I want to generate 32x32 sized thumbnails from uploaded images (actually avatars).
To prevent a thumbnail from being smaller than that size, I want to create a transparent 32x32 background and paste the thumbnail on it.
The code below tries to do so. However, the avatar is displayed on a black and opaque background; I lose transparency information somewhere through the process. Where am I doing wrong?...
How do I create a Status Icon / System Tray Icon with custom text and transparent background using Python and GTK?
Here is the code that I have so far to define the icon:
icon_bg = gtk.gdk.pixbuf_new_from_file('gmail.png')
w, h = icon_bg.get_width(), icon_bg.get_height()
cmap = gtk.gdk.Colormap(gtk.gdk.visual_get_system(), False)
drawable = gtk.gdk.Pixmap(None, w, h, 24)
drawable.set_colormap = cmap
gc = drawable.new_gc()
drawable.draw_pixbuf(gc, icon_bg, 0, 0, 0, 0, w, h)
drawn_icon = gtk.gdk.Pixbuf(gtk.gdk.COLORSPAC...
python - How to get transparent background in window with PyGTK and PyCairo?
I've been trying really hard to create a window with no decoration and a transparent background using PyGTK. I would then draw the content of the window with Cairo. But I can't get it to work.
I've tried a lot of different ways, they all failed, this is one of them
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk, sys, cairo
win = None
def expose (widget, event):
cr = widget...
White background to transparent background using PIL python
How can i transform all white background and white elements of a png or jpg image in a transparent backgroun using PIL?
java - Detect if .swf has transparent background
Is there a way to do this programmatically in PHP, Python or Java?
Use case:
User uploads .swf through an upload form.
Detect if it has a transparent background.
If it does, change it to something else, e.g. white.
user interface - I want to make a transparent BACKGROUND frame with my python app (WxPython)
I've always wanted to make a app that's transparent, I love how it looks. I tried to make on of my apps transparent with the SetTransparent(alpha), but I bumped into a big problem.
Yes it makes my app transparent (^。^), but it makes EVERYTHING transparent (=。=).
I have no idea how to fix this problem. Hours of research didn't really help out.
What I meant by background is, nothing el...
python - Transparent background file download from S3
I am trying to permit a python app to access various locations in a many-GB file stored in S3. I'd like to create a drop-in replacement file-like object that intelligently downloads chunks of data from S3 in a separate thread to meet seek() and read() requests.
Is there a simple data structure I can use to store arbitrary intervals of the file?
It must support O(log n) look-up and O(n) insertion (n=number o...
c++ - How to make wxPython, DC background transparent?
How can i make the default white DC background become invisible (transparent)?
Run the following example, it shows a white background over a button. I would like to remove the white background of the DC. (to show only the red X)
import wx
class drawover(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self....
python - Merging background with transparent image in PIL
I have a png image as background and I want to add a transparent mesh to this background but this doesn't work as expected. The background image is converted to transparent on places where I apply transparent mesh.
I am doing:
from PIL import Image, ImageDraw
map_background = Image.open(MAP_BACKGROUND_FILE).convert('RGBA')
map_mesh = Image.new('RGBA', (width, height), (0, 0, 0, 0))
draw = ImageDraw...
python - How to make a surface with a transparent background in pygame
Can someone give me some example code that creates a surface with a transparent background in pygame?
python - How to use PIL to make all white pixels transparent?
I'm trying to make all white pixels transparent using the Python Image Library. (I'm a C hacker trying to learn python so be gentle)
I've got the conversion working (at least the pixel values look correct) but I can't figure out how to convert the list into a buffer to re-create the image. Here's the code
img = Image.open('img.png')
imga = img.convert("RGBA")
datas = imga.getdata()
newData = list()
for i...
pygame - Updating part of a surface in python, or transparent surfaces
I have an application written in python that's basically an etch-a-sketch, you move pixels around with WASD and arrow keys and it leaves a trail. However, I want to add a counter for the amount of pixels on the screen. How do I have the counter update without updating the entire surface and pwning the pixel drawings?
Alternatively, can I make a surface that's completely transparent except for the text so you can se...
django - python PIL - background displayed opaque instead of transparent
I want to generate 32x32 sized thumbnails from uploaded images (actually avatars).
To prevent a thumbnail from being smaller than that size, I want to create a transparent 32x32 background and paste the thumbnail on it.
The code below tries to do so. However, the avatar is displayed on a black and opaque background; I lose transparency information somewhere through the process. Where am I doing wrong?...
python - Transparent FrameBuffer background in OpenGL
I want to use glClear and glClearColor to fill a frame buffer with a colour including alpha transparency. However the framebuffer always renders as opaque when binded to a texture which is rendered to the screen.
I want everything which is rendered to the framebuffer to kept their transparency. I just want to change the background.
See the following code:
def create_texture(surface):
surface...
How do I create a Status Icon / System Tray Icon with custom text and transparent background using Python and GTK?
Here is the code that I have so far to define the icon:
icon_bg = gtk.gdk.pixbuf_new_from_file('gmail.png')
w, h = icon_bg.get_width(), icon_bg.get_height()
cmap = gtk.gdk.Colormap(gtk.gdk.visual_get_system(), False)
drawable = gtk.gdk.Pixmap(None, w, h, 24)
drawable.set_colormap = cmap
gc = drawable.new_gc()
drawable.draw_pixbuf(gc, icon_bg, 0, 0, 0, 0, w, h)
drawn_icon = gtk.gdk.Pixbuf(gtk.gdk.COLORSPAC...
python - How to make cStringIO transparent to another function that expects a real local file
I came up with the following problem: CODE A works right now.. I am saving a png file called chart.png locally, and then I am loading it into the proprietary function (which I do not have access).
However, in CODE B, am trying to use cStringIO.StringIO() so that I do not have to write the file "chart.png" to the disk. But I cannot find a way to pass it to the pproprietaryfunction because it is expecting a real fil...
python - PIL: How to make area transparent in PNG?
I've been using PIL to crop Images, now I also want to make certain rectangular areas transparent, say
from PIL import Image
im = Image.open("sample.png")
transparent_area = (50,80,100,200)
...
python - Matplotlib transparent line plots
I am plotting two similar trajectories in matplotlib and I'd like to plot each of the lines with partial transparency so that the red (plotted second) doesn't obscure the blue.
EDIT: Here's the image with transparent lines.
python - Transparent 3D bar graphs
I would like to generate 3D bar graphs with transparent surfaces so that I can see what is going on behind tall bars.
The mplot3d API docs say that keywords are allowed for the bar3d function. I pass all the required parameters but can only output graphs with solid surfaces.
Still can't find your answer? Check out these communities...
PySlackers | Full Stack Python | NHS Python | Pythonist Cafe | Hacker Earth | Discord Python