2016-04-06 3 views
1

私は既存のビットマップにテキストを描画しようとしていますが、Graphics ContextのDrawTextメソッドを使用すると背景が削除されます。しかし、これは、空のビットマップからバックグラウンドイメージを作成した場合(ロードされたイメージのビットマップ上のDrawTextを使用してうまく動作する場合)にのみ発生します。 私は空のビットマップを作成するためにMemoryDCを使用しているので問題が発生したと思いますが、私はwxPythonには全く新しいので、修正する方法はわかりません。wxPython - GC.DrawTextは背景ビットマップを削除します

は、ここで私はこれまで何をやったかです:

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() 

私が言ったように、ロードされた画像が正しく表示されますが、EmptyBitmapで作成したものは、何のバックグラウンドを持っていない使用していますStaticBitmap。

どのように動作させるか考えていますか?

ありがとうございます

答えて

1

これは私にとってバグのようです。私はwx.MemoryDCのせいですが、より多くのボンネットの下が起こっているプラ​​ットフォーム固有のビットマップ作成ルーチン、ないと思います

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() 
    # ... 

:それを動作させるために、次を使用します。 wx.Imageで始めると、出力はより予測可能/有用であるように見えます。

+0

ありがとう、実際には問題を解決しました。 私は解決策を探していましたが、これはアルファベットをゼロにデフォルト設定することによって引き起こされる可能性があると言われました。 –

+0

私はアルファで何かをしなければならないということを証明することはできませんでしたが、実際に問題があるようです。以下を試してください: '' b = wx.EmptyBitmapRGBA(w、h、* color、alpha = 255) ''、 '' img = b.ConvertToImage() ''、 '' b = img.ConvertToBitmap() '' '' wx.Image'で前後に移動すると、アルファチャンネルがダンプされて動作します。 – nepix32

+0

[Tim Roberts on google groups wxPython-users](https://groups.google.com/forum/#!topic/wxpython-users/huyH0pKklks)も同じことを発見しました。アルファチャンネルのないビットマップを使用すると、作業。 – nepix32

関連する問題