2019年1月14日月曜日

wxPython マウス左クリックによる画像の縮小



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 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts