6
votes

Pygame, définir la transparence sur une image importée à l'aide de Convert_alpha ()

Dans mon jeu pygame, pour importer une image JPEG, j'utilise convert () http://www.pygame.org/docs/ref/surface .html # pygame.surface.convert

Ensuite, pour jouer avec la transparence de l'image (combien nous pouvons voir auge l'image), j'utilise set_alpha () http://www.pygame.org/docs/ref/surface .html # pygame.surface.set_alpha

Cependant, pour importer mon image PNG, qui ont un arrière-plan transparent, j'utilise convert_alpha () http://www.pygame.org/docs/ref/surface .html # pygame.surface.convert_alpha

Mais avec cette façon d'importer, je ne peux pas jouer avec la transparence générale à l'aide de set_alpha () . Toute autre idée pour ajuster la transparence (combien nous voyons l'image)?


0 commentaires

4 Réponses :


0
votes

Utilisez set_colorkey (couleur) pour définir une couleur transparente. Par exemple, si vous avez une image d'une pomme, et tout sauf la pomme est la couleur noire, vous utiliseriez Apple.set_Colorkey (noir) et tout sauf la pomme serait transparente. De plus, si vous avez des difficultés à utiliser une image JPG, je vous suggère de le changer à un PNG, puis de faire .converver ().


1 commentaires

Vous n'avez pas compris ma question. J'utilise déjà le fichier PNG. convert () fait un cadre noir sur mon png, donc j'utilise convert_alpha à la place. Le problème clé est que je souhaite également configurer la transparence générale également (combien nous voyons toute l'image). Normalement, j'utilise set_alpha () pour cet objectif. Toutefois, lorsque vous importez une image à l'aide de convert_alpha () comme je le fais, set_alpha () ne fonctionne pas. Je cherche un set_alpha () alternative



6
votes

Lorsque vous lisez la documentation pour set_alpha forte>, vous pouvez lire ceci: Si le format de surface contient par pixel alphas, cette valeur alpha sera ignorée. em>

% dans votre cas, avec une image PNG, c'est un alphas pixels. Donc, vous devez gérer Alpha "par pixel". Par exemple, vous pouvez le faire (pas le meilleur code, mais facile à comprendre. Travailler avec PNG sans transparence non / Oui): P>

    screen.blit(image.get_img(60),(0,0))


5 commentaires

J'ai eu un cadre noir avec la première formule, mais le second fonctionne bien :), mais c'est très lent, mon jeu tombe à 25 fps ...


une idée de la rendre plus optimisée?


Je ne sais pas comment votre jeu fonctionne et l'optimisation d'un tel code dépend de la manière dont elle est utilisée. Combien de temps le changement alpha? Quelle est la taille des images? Sans programmation de niveau bas, vous pouvez utiliser "cache" pour les données: vous utiliserez plus de mémoire, mais précompute alpha for image montrera une grande amélioration sans beaucoup d'œuvres.


En fait, je l'utilise pour faire une apparition en douceur de l'objet dans mon jeu (l'objet apparaît progressivement), donc, lorsqu'un objet apparaît actuellement, la fonction est appelée sur chaque image.


Donc, vous pouvez faire défendre Self.Pre_Compute_alpha (). Il n'y a pas de solution facile car vous utilisez Python et Pygame et multiples alpha. Je vois deux autres variantes: utilisez le masque pour Blit, ou utilisez NUMPY pour fonctionner avec vos données. Peut-être, utilisez une alternative pygame également qui supporte le niveau de transparence. Allez de la chance avec ça;).



1
votes

OK, j'ai la réponse pour vous. La fonction "Convert_alpha ()" de Pygame ne prend pas en charge par pixel alpha. Basé sur le paramètre Docs Alpha n'aura aucun effet. Cependant, vous pouvez contourner cette limitation en procédant comme suit. Si vous chargez votre image à l'aide de "Convertir ()", puis définissez Alpha, vous pouvez obtenir votre image de devenir transparente. Ensuite, tout ce que vous avez à faire est d'utiliser "Set_Colorkey (couleur de fond)" pour éliminer l'image d'arrière-plan. Soyez attentionné avec Colorkey, car toute couleur de l'image qui est définie comme la couleur colorée deviendra transparente. La Colorkey ne se soucie pas du pixel alpha afin que vous puissiez modifier l'alpha d'une image et utiliser colorkey en même temps.

Voici le code ... P>

#Loading Image
image = pygame.image.load("test.png").convert()

#Setting Alpha
image.set_alpha(some desired alpha)

#Set colorkey To Eliminate Background Color
image.set_colorkey(some background color)


0 commentaires

2
votes

La solution la plus rapide est probablement d'utiliser la manipulation de tableau code> NUMPY code>, il devrait être suffisamment rapide pour éviter la mise en cache. Ce qui est vraiment lent sur le calcul de la valeur alpha pixel-wise est itération en python, tandis que numpy code> est tout dans C.

Commencez par référencer le canal alpha de l'image dans un numpy Code> Array. Cela créera un verrou sur la surface de l'image; Rappelons-nous que pour plus tard. Ensuite, prenez le minimum (pixel-wise) de votre alpha d'origine et une matrice pleine de celles (qui vous laisseront avec un tableau de seuls et des zéros), multipliez cela (pixel-wise) par votre alpha souhaité et copiez le résultat en arrière au canal alpha de l'image (toujours représenté par cette référence de tableau). Avant de pouvoir bliter l'image à l'écran, la référence de la matrice au tableau alpha doit être effacée, libérant le verrou sur la surface de l'image. P>

def change_alpha(img, alpha=255):
    chan = pygame.surfarray.pixels_alpha(img)
    chan2 = numpy.minimum(chan, numpy.ones(chan.shape, dtype=chan.dtype)) * alpha
    numpy.copyto(chan, chan2)
    del chan


0 commentaires