2013-08-20 1 views
0

J'ai besoin de charger un jpeg-> dessiner un rectangle semi-transparent-> enregistrer le fichier jpeg en utilisant wx.Bitmap du paquetage python wx. Mais le rectangle semble complètement opaque. J'utilise Windows 7 avec 32bpp. J'ai vérifié et essayé la démo "Docs and Demos \ demo \ AlphaDrawing.py", et cela fonctionne bien. Il dessine correctement sur wx.Panel un rectangle semi-transparent.Dessiner un rectangle semi-transparent sur un fichier jpeg avec wx.Bitmap

J'ai vérifié sur Internet pour trouver une solution à ce problème, mais aucune des solutions n'a fonctionné.

J'ai créé un exemple plus simple, pour minimiser les possibilités d'erreur, et ne fonctionnait toujours pas. Charger un JPG-> dessiner un rectangle- semi-transparent> enregistrer en tant que fichier jpg

wimg = wx.Image(r"N:\Images\Wallpapers\Processed\a.jpg", wx.BITMAP_TYPE_JPEG) 
print wimg.HasAlpha() 
wimg.InitAlpha() 
print wimg.HasAlpha() 
bmp = wimg.ConvertToBitmap() 
print bmp.HasAlpha() 
dc = wx.MemoryDC(bmp) 
r, g, b = (34, 34, 34) 
dc.SetPen(wx.Pen(wx.Colour(r, g, b, wx.ALPHA_OPAQUE))) 
dc.SetBrush(wx.Brush(wx.Colour(r, g, b, 128))) 
dc.DrawRectangle(100, 300, 200, 200) 
bmp.SaveFile(r"N:\Images\Wallpapers\Processed\b.jpg", wx.BITMAP_TYPE_JPEG) 

Les résultats d'impression sont: Faux/Vrai/Vrai Et toujours la sortie, il est un rectangle complètement opaque

I jpeg connu n'a pas de canaux alpha, mais je ne veux pas un jpeg 32bpp. Juste la sortie pour montrer le rectangle mélangé avec l'arrière-plan.

Répondre

0

Les fichiers bitmap n'ont pas de canal alpha. Vous devez charger un fichier PNG pour utiliser la transparence. "Contrairement aux données RVB, toutes les images ne disposent pas d'une couche alpha et avant d'utiliser GetAlpha, vous devez vérifier si cette image contient une couche alpha avec HasAlpha Notez que seules les images chargées à partir de fichiers PNG avec transparence "

http://www.wxpython.org/docs/api/wx.Image-class.html

+0

Bon point! J'ai lu la documentation et cela correspond à ce que vous mentionnez. Mais, maintenant j'ai fait quelques tests en chargeant 32bpp .png et .bmp en utilisant Windows 7. Et en fait les résultats sont le contraire. Si je fais: impression wimg.HasAlpha() bmp = wimg.ConvertToBitmap() impression bmp.HasAlpha() je reçois vrai deux fois le chargement .bmp et faux sur le .png Mais encore doesn Ne résout pas mon problème. Je vais mettre à jour le post, pour refléter le vrai problème: Dessiner un rectangle semi-transparent sur un fichier jpeg –

Questions connexes