[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] loss of transparency in scaling surfaces



Sibtey Mehdi wrote:

Hi

I am drawing a line on pygame screen and created one transparent surface of size (800,700) and scaling down using smoothscale to the pygame screen size .In this condition everything is working fine.

If have created the transparent surface of size like 4892X3614 and then scaling down to the pygame screen size then transparency is lost. Can any one help me understanding this? The script is shown below

import pygame

BACKGROUNDCOLOR = (255,255,255)

[snip code]

# for large surface like this transparecy is Lost

surf = pygame.Surface((4892,3614))

surf.fill(BACKGROUNDCOLOR)

# set transparency

surf.set_colorkey(BACKGROUNDCOLOR,pygame.RLEACCEL)

#draw a line on transparent surface

pygame.draw.line(surf,(200,155,155), (550,550),(750,550),2)

#scale down

surf3  = pygame.transform.smoothscale(surf, (800,700))

screen.blit(surf3,(0,0))

pygame.display.flip()

[snip code]

The problem is that smoothscale doesn't guarantee colors will remain unchanged. I found the background color of surf3 was (253, 253, 253, 255). The following modified version code does make surf3's background transparent.

import pygame
import sys
BACKGROUNDCOLOR = (255,255,255)
pygame.display.init()
screen = pygame.display.set_mode((800,700))
screen.fill(BACKGROUNDCOLOR)
# draw a line on pygame screen
pygame.draw.line(screen,(255,0,0), (50,50),(100,100),1)
# for small surface like this transparecy is fine
## *************************************************
##surf = pygame.Surface((800,700))
## **************************************************************
# for large surface like this transparecy is Lost
surf = pygame.Surface((4892,3614), 0, 24)
surf.fill(BACKGROUNDCOLOR)
#draw a line on transparent surface
pygame.draw.line(surf,(200,155,155), (550,550),(750,550),2)
#scale down
surf3  = pygame.transform.smoothscale(surf, (800,700))
#set transparency
surf3.set_colorkey(surf3.get_at((0,0)),pygame.RLEACCEL)
screen.blit(surf3,(0,0))

pygame.display.flip()
while 1:
   events = pygame.event.get()
   for event in events:
       if event.type==pygame.KEYDOWN and event.key ==pygame.K_ESCAPE:
           pygame.display.quit()
           sys.exit()


But it also shows that transparency and scaling don't go together well. Using colorkey with per-pixel alpha may be a better solution:

....
surf = pygame.Surface((4892,3614), pygame.SRCALPHA, 32)
bg = BACKGROUNDCOLOR
surf.fill((bg[0],bg[1],bg[2],0)) # Transparent background color.
....
surf3  = pygame.transform.smoothscale(surf, (800,700))
screen.blit(surf3,(0,0))
....

--
Lenard Lindstrom
<len-l@xxxxxxxxx>