sample.png
trans.png
背景透過画像
2018・01・15更新
動作
マウス左クリックをするたびに、画像が縮小するようにしてみました。背景画像に大きな円(中の色が黄緑色?)を描いています。
背景が透過の画像を縮小しても、透過画像のままで、成功しました。
設定
以下のようにTrueを入れると、背景が透過の画像はそのまま透過画像として表示されます。
dc.DrawBitmap(self.bmp, 0, 100, True)
画像を縮小するScaleで、IMAGE_QUALITY_HIGHを使うと一部透過しない部分ができたので
これを省きました。
image = image.Scale(self.width, self.height, wx.IMAGE_QUALITY_HIGH)
参考サイト
#pythonでGUIツールを作る ~ 画像のリサイズ ~#https://python-minutes.blogspot.com/2017/01/pythongui_3.html
#画像をドラッグでサイズを変更したい
主要コード
ビットマップを一旦イメージに変更して、imageのScaleでサイズを変更後ビットマップに戻しています。
なぜなら、wx.Bitmapには、wx.Imageのよう画像のサイズ変更回転などの
関数がありませんからだと思われます。
def scale_bitmap(self):
self.width -= 5
image = wx.ImageFromBitmap(self.bmp)
image = image.Scale(self.width, self.height, wx.IMAGE_QUALITY_HIGH)
result = wx.BitmapFromImage(image)
return result
全コード
E:\MyBackups\goolgedrive\myprg_main\python_my_prg\wxpython\dc\お絵かき3\gazou_scale.py# coding: UTF-8
#参考サイト
#http://maku77.github.io/python/wxpython/graphics.html
#bitmap
#pythonでGUIツールを作る ~ 画像のリサイズ ~
#https://python-minutes.blogspot.com/2017/01/pythongui_3.html
#画像をドラッグでサイズを変更したい
import wx
class MyFrame(wx.Frame):
#メニューバー 、ステータスバー,ツールバーなどはFrmae上し
#か置けないため、paelを作成し、そこで描画する
## *args 可変長タプル **kwargs 可変長辞書
def __init__(self, parent, *args ,**kargs):
frame = wx.Frame.__init__(self, parent, *args, **kargs)
pal2 = DrawPanel(self)
self.Show()
class DrawPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
#self.parent = parent
self.bmp = wx.Bitmap('sample.png')
self.gs = GazouScale(self.bmp)
#初期化
self.firstInitBuffer()
# RefreshによってOnPaintがよばれている
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftButtonDownEvent)
def OnLeftButtonDownEvent(self, event):
self.bmp = self.gs.scale_bitmap()
self.clearWindow()
self.InitBuffer()
"""画面書き換え要求があった時に呼ばれる処理"""
def OnPaint(self, event=None):
print "OnPaint"
dc = wx.BufferedPaintDC(self, self.buffer)
"""ウインドウサイズが変更された時に呼ばれる処理"""
#かなり複雑になるのでこのイベントやめる
def OnSize(self, event=None):
print "OnSize"
pass
"""初期化"""
def firstInitBuffer(self):
#print "InitBuffer"
self.buffer = wx.EmptyBitmap(1280, 708)
dc = wx.BufferedDC(None, self.buffer)
dc.SetBackground(wx.Brush('white'))
# デバイスコンテキストでクリア、これがないと画面が真っ暗になる
dc.Clear()
self.Draw(dc) # 実際の描画処理
# Falseを指定して背景を消さなくしたら画面のちらつきが出なくなった
self.Refresh(eraseBackground=False)
#描画のアップデートをする関数
"""描画更新"""
def InitBuffer(self):
#self.buffer = wx.EmptyBitmap(1280, 708)
dc = wx.BufferedDC(None, self.buffer)
#dc.SetBackground(wx.Brush('white'))
#dc.Clear() # デバイスコンテキストでクリア
self.Draw(dc) # 実際の描画処理
# Falseを指定して背景を消さなくしたら画面のちらつきが出なくなった
self.Refresh(eraseBackground=False)
"""画面を一旦クリアしないと前に描画した画像が消えず残ってしまう"""
def clearWindow(self):
#print "clearWindow"
self.buffer = wx.EmptyBitmap(1280, 708)
dc = wx.BufferedDC(None, self.buffer)
dc.SetBackground(wx.Brush('white'))
dc.Clear() # デバイスコンテキストでクリア
"""実際の描画処理"""
def Draw(self, dc):
#print "Draw"
dc.SetBrush(wx.Brush(wx.Colour(128, 255, 128)))
dc.SetPen(wx.Pen("RED", 3))
#つまり 輪郭が赤中が黄緑色?になる
dc.DrawCircle(0, 0, 10)
#引数の数字は画像の位置座標
dc.DrawBitmap(self.bmp, 0, 100, True)
""" 画像のリサイズ """
class GazouScale():
def __init__(self, bmp):
print "GazouScale"
self.bmp = bmp
#self.parent = parent
self.width = self.bmp.GetWidth()
self.height = self.bmp.GetHeight()
#画像のリサイズ
def scale_bitmap(self):
self.width -= 5
image = wx.ImageFromBitmap(self.bmp)
#image = image.Scale(self.width, self.height, wx.IMAGE_QUALITY_HIGH)
image = image.Scale(self.width, self.height)
result = wx.BitmapFromImage(image)
return result
if __name__ == '__main__':
app = wx.App(False)
MyFrame(None, -1, "Draw Test 4", size=(800, 600))
app.MainLoop()
0 件のコメント:
コメントを投稿