2016-04-06 27 views
1

Varolan bitmap'e bir metin çizmeye çalışıyorum ancak Graphics Context'in DrawText yöntemini kullandığımda arka plan kaldırılır. Ancak bu, yalnızca boş bitmap'ten arka plan görüntüsü oluşturduğumda (yüklenen görüntülerden Bitmap'te DrawText kullanarak) iyi olur. Sanırım boş bir bitmap oluşturmak için MemoryDC kullanıyorum, ancak wxPython için oldukça yeniyim, bu yüzden bu sorunu düzeltmek için hiçbir fikrim yok çünkü sorun olur.wxPython - GC.DrawText arka plan bitmap'ini kaldırır

İşte ben bugüne kadar yaptığım budur:

import wx 

def GetEmptyBitmap(w, h, color=(0,0,0)): 
    """ 
    Create monochromatic bitmap with desired background color. 
    Default is black 
    """ 
    b = wx.EmptyBitmap(w, h) 
    dc = wx.MemoryDC(b) 
    dc.SetBrush(wx.Brush(color)) 
    dc.DrawRectangle(0, 0, w, h) 
    return b 

def drawTextOverBitmap(bitmap, text='', fontcolor=(255, 255, 255)): 
    """ 
    Places text on the center of bitmap and returns modified bitmap. 
    Fontcolor can be set as well (white default) 
    """ 
    dc = wx.MemoryDC(bitmap) 
    gc = wx.GraphicsContext.Create(dc) 
    font = wx.Font(16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) 
    gc.SetFont(font, fontcolor) 
    w,h = dc.GetSize() 
    tw, th = dc.GetTextExtent(text)  
    gc.DrawText(text, (w - tw)/2, (h - th)/2) 
    return bitmap 

app = wx.App() 
bmp_from_img = bmp = wx.Image(location).Rescale(200, 100).ConvertToBitmap() 
bmp_from_img = drawTextOverBitmap(bmp_from_img, "From Image", (255,255,255)) 

bmp_from_empty = GetEmptyBitmap(200, 100, (255,0,0)) 
bmp_from_empty = drawTextOverBitmap(bmp_from_empty, "From Empty", (255,255,255)) 


frame = wx.Frame(None) 
st1 = wx.StaticBitmap(frame, -1, bmp_from_img, (0,0), (200,100)) 
st2 = wx.StaticBitmap(frame, -1, bmp_from_empty, (0, 100), (200, 100)) 
frame.Show() 
app.MainLoop() 

Dediğim gibi yüklü bir görüntü düzgün görüntülenir ancak EmptyBitmap ile oluşturulan bir hiç bir geçmişe sahiptir kullanır StaticBitmap.

Nasıl çalışacağına dair herhangi bir fikriniz var mı?

Teşekkür ederiz

cevap

1

Bu bana bir hata gibi görünüyor. İşe yaraması için aşağıdakileri kullanın:

def GetEmptyBitmap(w, h, color=(0,0,0)): 
    # ... 
    # instead of 
    # b = wx.EmptyBitmap(w, h) 
    # use the following: 
    img = wx.EmptyImage(w, h) 
    b = img.ConvertFromBitmap() 
    # ... 

Ben wx.MemoryDC sorumlu olduğu değil düşünüyorum, ama platforma özel bitmap oluşturma rutinleri, nerede daha başlık altında oluyor orada. wx.Image ile başlayarak, çıktı daha öngörülebilir/kullanışlı görünmektedir.

+0

Teşekkürler, bu aslında sorunu çözdü. Çözümü aradığımda, buna alfa sıfıra sıfırlamadan kaynaklanabileceği söylendi. –

+0

Ben alfa ile bir şey yapmak zorunda olduğunu kanıtlamak mümkün değildi, ama aslında sorun gibi görünüyor. Aşağıdakileri deneyin: '' b = wx.EmptyBitmapRGBA (w, h, * color, alpha = 255) '', 'img = b.ConvertToImage()' ',' b = img.ConvertToBitmap() ''. '' Wx.Image'' üzerinde ileri geri gidip alfa kanalını döker ve sonra çalışır. – nepix32

+0

[Tim Roberts, google gruplarında wxPython kullanıcıları] (https://groups.google.com/forum/#!topic/wxpython-users/huyH0pKklks) aynı şeyi buldu: Alfa kanalı olmayan bitmap'e sahip olmak, iş. – nepix32