2016/10/30(日) [n年前の日記]
#2 [python] PySideでファイルオープンダイアログを表示したり等
PySideをまだ勉強中。
 ◎ ファイルオープンダイアログとファイル保存ダイアログ。 :
こんな感じで書けば、ファイルオープンダイアログ、ファイル保存ダイアログが開くらしい。
返り値を、fpath, _ で受け取ってるサンプルがあって、「『_』って何だ?」と思ったけど。タプルの返り値を受け取る際に、使わない値は「_」で受け取って捨ててしまう、みたいな何かがあるらしい。
    def show_open_dialog(self):
        u"""ファイルオープンダイアログを表示."""
        filter = "Image Files (*.png *.bmp *.jpg *.jpeg)"
        fpath, _ = QFileDialog.getOpenFileName(self, "Open File", self.cur_dir, filter)
        if fpath:
            self.gview.load_canvas_image(fpath)
        else:
            # cancel
            pass
    def show_save_dialog(self):
        u"""ファイル保存ダイアログを表示."""
        filter = "Image Files (*.png)"
        fpath, _ = QFileDialog.getSaveFileName(self, "Save File", self.cur_dir, filter)
        if fpath:
            self.gview.scene().save_canvas(fpath)
        else:
            # cancel
            pass
キャンセルボタンが押された時は何が返ってくるのか分からなかったけど、ひょっとすると空文字列("") が返ってくるのかもしれない。返り値を、fpath, _ で受け取ってるサンプルがあって、「『_』って何だ?」と思ったけど。タプルの返り値を受け取る際に、使わない値は「_」で受け取って捨ててしまう、みたいな何かがあるらしい。
◎ QPixmapのファイル保存。 :
 PySideで、画像の描画その他に使う QPixmap を、画像ファイルとして保存するのは、save() を使えばいいらしい。
_QPixmap - PySide v1.0.7 documentation
    def save_canvas(self, fpath):
        u"""キャンバスを画像ファイルとして保存."""
        self.canvas_pixmap.save(fpath, "PNG")
引数として、ファイルパス、画像フォーマット、圧縮率を渡す模様。圧縮率の指定を省略するとデフォルトの圧縮率で保存される、と書いてあるように見えた。_QPixmap - PySide v1.0.7 documentation
◎ QPixmapの指定座標の色情報を取得。 :
 QPixmap の指定座標からRGBA値を取得したいと思ったのだけど、QPixmap からは取得できないようで。ただし、toImage() を使って、一旦 QImage に変換してやれば、long値として取得できる模様。
取得したlong値をRGBAに変換するなら、QColor が使える。QColor.setRgba( long値 ) で long値を渡して設定してやれば、後は red()、green()、blue()、alpha() で、R,G,B,Aの値を取得できる。
long値はARGBの順で並んでるようにも見えたから、シフトとマスクで取り出せるんじゃないのとも思ったけど、仕様変更された時の対処や、OSによって並びが異なる可能性も考えると、面倒でも(?)、QColor を使ったほうがいいのかもしれない。
    def get_rgb_from_canvas(self, pos):
        u"""キャンバスの指定座標からRGBA値 (r,g,b,a) を取得."""
        x = int(pos.x())
        y = int(pos.y())
        pm = self.canvas_pixmap
        w, h = pm.width(), pm.height()
        if x < 0 or x >= w or y < 0 or y >= h:
            return None
        argb_long = pm.toImage().pixel(x, y)
        argb = QColor()
        argb.setRgba(argb_long)
        r = argb.red()
        g = argb.green()
        b = argb.blue()
        a = argb.alpha()
        return (r, g, b, a)
取得したlong値をRGBAに変換するなら、QColor が使える。QColor.setRgba( long値 ) で long値を渡して設定してやれば、後は red()、green()、blue()、alpha() で、R,G,B,Aの値を取得できる。
long値はARGBの順で並んでるようにも見えたから、シフトとマスクで取り出せるんじゃないのとも思ったけど、仕様変更された時の対処や、OSによって並びが異なる可能性も考えると、面倒でも(?)、QColor を使ったほうがいいのかもしれない。
[   ツッコむ ]
以上です。