[ todo ] pillow enhancer version 15

2019/06/28 17:03 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
[ todo ] pillow enhancer
@[TOC](項目)

# グラデ関係

マスク画像が変更されたらgradeクラスからメッセージをもらう
本体でマスクがオンなら描画する
まず画像を変換してself.maskにpilのimageをセットする

1. 基本はこれだけど出来るかな?
左からのメッセージの受け関数をとりあえず作って

```
import io
from PyQt5.QtCore QBuffer , QIODevice

def test():
 buffer = QBuffer()
 buffer.open(QIODevice.WriteOnly)
 Qimage.save( buffer ,'BMP' )
 self.mask = Image.open( io.BytesIO( buffer  ) )  # ここがうまくいくか??
 # ** buffer.data() buffer.buffer() buffer.read()
 # https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtcore/qbuffer.html#
 self.mask.show()
```  

- 問題はQt、Python、pillowの互換性
Qtからのメモリ書き出しはQIODeviceに対してだがpythonのオブジェクトに直接書き込めないのかな
```
buffer = bytearray()
Qimage.save( buffer ,'BMP' )
```
あるいは
```
buffer = bytearray()
buffer_io = io.BytesIO()
Qimage.save( buffer_io ,'BMP' )
```
こんなのじゃダメかな??

2. 
def qimage_to_pilimage(qimage):

    buffer = QBuffer()
    buffer.open(QIODevice.WriteOnly)
    qimage.save(buffer, "BMP")
    
    fp = cStringIO.StringIO()
    fp.write(buffer.data())
    buffer.close()
    fp.seek(0)
    return PIL.Image.open(fp)

3. 
https://teratail.com/questions/71426

url = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Wrightflyer.jpg/800px-Wrightflyer.jpg"
url = "pass"
img_read = urllib.request.urlopen(url).read()
img_bin = io.BytesIO(img_read)

pil_img = Image.open(img_bin)  # PILで開く
# PILでごにょごにょする

# PNGでエンコード
modified_bin = io.BytesIO()
pil_img.save(modified_bin, format='PNG')

4. pillow 自分でグラデを書く
https://codeday.me/jp/qa/20190309/385657.html

5. numpy で書く
5. numpy で自力で書く
https://note.nkmk.me/python-numpy-generate-gradation-image/
https://showa-yojyo.github.io/notebook/python-pillow.html#id21



----
- 円とグラデの中心をドラッグ対応にするか?
- 線形グラデ対応

- PyQtでお手軽GUI開発♪―――は可能だったか? 第4回 画面描画編 
http://www7a.biglobe.ne.jp/~thor/novel/column/07.html

```
def paintEvent(self, event):

    canvas = Qg.QPainter(self)                  #画面のPainterを取得する

    #線形グラデーション
    grad = Qg.QLinearGradient(25,0,75,100)      #座標(25,0)~(75,100)間で定義
    grad.setColorAt(0.1, Qg.QColor(Qt.red))     #色の位置の設定
    grad.setColorAt(0.5, Qg.QColor(Qt.green))
    grad.setColorAt(1.0, Qg.QColor(Qt.blue))
    canvas.setBrush(Qg.QBrush(grad))            #画面に描画する
    canvas.drawRect(0,0,100,100)

    #放射状グラデーション
    grad = Qg.QRadialGradient(150,50,50,160,60) #(150,50)を中心、半径50、(160,60)が開始位置
    grad.setColorAt(0.0, Qg.QColor(Qt.white))   #色を指定
    grad.setColorAt(1.0, Qg.QColor(Qt.blue))
    canvas.setBrush(Qg.QBrush(grad))            #画面への描画
    canvas.drawRect(100,0,100,100)

    #円錐形グラデーション
    grad = Qg.QConicalGradient(250, 50, 45)     #座標(250,50)を中心に45度角から開始
    grad.setColorAt(0.0, Qg.QColor(Qt.red))     #色の指定
    grad.setColorAt(0.33, Qg.QColor(Qt.green))
    grad.setColorAt(0.66, Qg.QColor(Qt.blue))
    grad.setColorAt(1.0, Qg.QColor(Qt.red))
    canvas.setBrush(Qg.QBrush(grad))            #画面への描画
    canvas.drawRect(200,0,100,100)
```

----------------

# グラデ マウス実装
enhancer.py
enhancer_ui.py
enhancer_subclasses.py

```
# enhancer_subclasses.py
from      import Qt
from      import QPos

class mylabel(QLabel):
    def __init(self , oya)__:
        self.oya = oya
        self.flag = 0
        self.pos = QPos()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton :
            self.flag = 1
        elif event.button() == Qt.MidButton :
            self.flag = 2
            self.pos = event.pos()
        elif event.button() == Qt.RightButton :
            self.flag = 3
        else :
            self.flag = 0

    def mouseMoveEvent(self, event):
        if self.flag ==1 or self.flag ==3 :
            self.oya.setValue( self.flag , event.pos() )
        elif self.flag == 2 :
            self.oya.setValue( self.flag , QPos(event.pos().x() - self.pos.x() , 
                event.pos().y() - self.pos.y() ) )
        else :
            pass

    def mouseReleaseEvent(self, event):
        self.flag = 0

# enhancer.py

    def setValue( self , flag , pos):
        if flag == 1 :
            self.list[0][1]=pos.x()
            self.list[1][1]=pos.y()
        elif flag == 3 :
            self.list[3][1]=pos.x()
            self.list[4][1]=pos.y()
        elif flag == 2 :
            p = pos.x() if pos.x()>pos.y() else pos.y()
            self.list[2][1] += p
        else :
            pass
        --> redraw
```

----------------
# enhancer usage
```
def init

self.list = [
    [ self.ui.label_* , ImageEnhance.Brightness ] ,
    [ self.ui.label_* , ImageEnhance.Contrast ] ,
    [ self.ui.label_* , ImageEnhance.Color ] ,       # 彩度
    [ self.ui.label_* , ImageEnhance.Sharpness ] ,
]


def *****(self,v):
 for l in self.list:
  if l[0] is self.sender() :
  ******
  break

```


-------
# 画質の調整

- 透明度アルファ付きのRGBに変換
con4 = image1.convert('RGBA')

- 彩度
from PIL import ImageEnhance    #ImageEnhanceのインポート
con5 = ImageEnhance.Color(image1)
con5_image = con5.enhance(0.4)  # 1が基本
<con5_image>

- コントラストを調整
con7 = ImageEnhance.Contrast(image1)
con7_image = con7.enhance(0.5)  # 1が基本
<con7_image>

- 明度
con9 = ImageEnhance.Brightness(image1)
con9_image = con9.enhance(0.5)  # 1が基本
con9_image

- シャープネス
con11 = ImageEnhance.Sharpness(image1)
con11_image = con11.enhance(0.5)
con11_image

----
# pillowについて調べた

- 公式
https://pillow.readthedocs.io/en/5.2.x/index.html

- エフェクトはここがわかりやすいね
Qtへの変換も
https://qiita.com/pashango2/items/145d858eff3c505c100a

- タグ取得はここ
https://qiita.com/Gen6/items/88c69ab3a0666895e7a8

- pil はQt変換を標準でサポートしてるのか??
https://dungeonneko.hatenablog.com/entry/2015/07/19/142034
Qpixmapに直接読み込むのとどっちが速いか試してみよう

- 画像貼り付け
Python, Pillowで画像に別の画像を貼り付けるpaste
https://note.nkmk.me/python-pillow-paste/
位置指定して小さい画像を貼り付けできる

- PIL.Image と PyQt4.QtGui.QImageの相互変換 
http://doloopwhile.hatenablog.com/entry/20100305/1267782841
グラデ画像は逆変換になるな


----
→ [目次に戻る](https://mimemo.io/m/QORbW4qkvOoda0N)

      

項目グラデ関係PILでごにょごにょするPNGでエンコードグラデ マウス実装enhancer usage画質の調整pillowについて調べた

グラデ関係

マスク画像が変更されたらgradeクラスからメッセージをもらう
本体でマスクがオンなら描画する
まず画像を変換してself.maskにpilのimageをセットする

  1. 基本はこれだけど出来るかな?
    左からのメッセージの受け関数をとりあえず作って
import io
from PyQt5.QtCore QBuffer , QIODevice

def test():
 buffer = QBuffer()
 buffer.open(QIODevice.WriteOnly)
 Qimage.save( buffer ,'BMP' )
 self.mask = Image.open( io.BytesIO( buffer  ) )  # ここがうまくいくか??
 # ** buffer.data() buffer.buffer() buffer.read()
 # https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtcore/qbuffer.html#
 self.mask.show()
  • 問題はQt、Python、pillowの互換性
    Qtからのメモリ書き出しはQIODeviceに対してだがpythonのオブジェクトに直接書き込めないのかな
buffer = bytearray()
Qimage.save( buffer ,'BMP' )

あるいは

buffer = bytearray()
buffer_io = io.BytesIO()
Qimage.save( buffer_io ,'BMP' )

こんなのじゃダメかな??

def qimage_to_pilimage(qimage):

buffer = QBuffer()
buffer.open(QIODevice.WriteOnly)
qimage.save(buffer, "BMP")

fp = cStringIO.StringIO()
fp.write(buffer.data())
buffer.close()
fp.seek(0)
return PIL.Image.open(fp)

https://teratail.com/questions/71426

url = "pass"
img_read = urllib.request.urlopen(url).read()
img_bin = io.BytesIO(img_read)

pil_img = Image.open(img_bin) # PILで開く

PILでごにょごにょする

PNGでエンコード

modified_bin = io.BytesIO()
pil_img.save(modified_bin, format='PNG')

  1. pillow 自分でグラデを書く
    https://codeday.me/jp/qa/20190309/385657.html

  2. numpy で自力で書く
    https://note.nkmk.me/python-numpy-generate-gradation-image/
    https://showa-yojyo.github.io/notebook/python-pillow.html#id21


def paintEvent(self, event):

    canvas = Qg.QPainter(self)                  #画面のPainterを取得する

    #線形グラデーション
    grad = Qg.QLinearGradient(25,0,75,100)      #座標(25,0)~(75,100)間で定義
    grad.setColorAt(0.1, Qg.QColor(Qt.red))     #色の位置の設定
    grad.setColorAt(0.5, Qg.QColor(Qt.green))
    grad.setColorAt(1.0, Qg.QColor(Qt.blue))
    canvas.setBrush(Qg.QBrush(grad))            #画面に描画する
    canvas.drawRect(0,0,100,100)

    #放射状グラデーション
    grad = Qg.QRadialGradient(150,50,50,160,60) #(150,50)を中心、半径50、(160,60)が開始位置
    grad.setColorAt(0.0, Qg.QColor(Qt.white))   #色を指定
    grad.setColorAt(1.0, Qg.QColor(Qt.blue))
    canvas.setBrush(Qg.QBrush(grad))            #画面への描画
    canvas.drawRect(100,0,100,100)

    #円錐形グラデーション
    grad = Qg.QConicalGradient(250, 50, 45)     #座標(250,50)を中心に45度角から開始
    grad.setColorAt(0.0, Qg.QColor(Qt.red))     #色の指定
    grad.setColorAt(0.33, Qg.QColor(Qt.green))
    grad.setColorAt(0.66, Qg.QColor(Qt.blue))
    grad.setColorAt(1.0, Qg.QColor(Qt.red))
    canvas.setBrush(Qg.QBrush(grad))            #画面への描画
    canvas.drawRect(200,0,100,100)

グラデ マウス実装

enhancer.py
enhancer_ui.py
enhancer_subclasses.py

# enhancer_subclasses.py
from      import Qt
from      import QPos

class mylabel(QLabel):
    def __init(self , oya)__:
        self.oya = oya
        self.flag = 0
        self.pos = QPos()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton :
            self.flag = 1
        elif event.button() == Qt.MidButton :
            self.flag = 2
            self.pos = event.pos()
        elif event.button() == Qt.RightButton :
            self.flag = 3
        else :
            self.flag = 0

    def mouseMoveEvent(self, event):
        if self.flag ==1 or self.flag ==3 :
            self.oya.setValue( self.flag , event.pos() )
        elif self.flag == 2 :
            self.oya.setValue( self.flag , QPos(event.pos().x() - self.pos.x() , 
                event.pos().y() - self.pos.y() ) )
        else :
            pass

    def mouseReleaseEvent(self, event):
        self.flag = 0

# enhancer.py

    def setValue( self , flag , pos):
        if flag == 1 :
            self.list[0][1]=pos.x()
            self.list[1][1]=pos.y()
        elif flag == 3 :
            self.list[3][1]=pos.x()
            self.list[4][1]=pos.y()
        elif flag == 2 :
            p = pos.x() if pos.x()>pos.y() else pos.y()
            self.list[2][1] += p
        else :
            pass
        --> redraw

enhancer usage

def init

self.list = [
    [ self.ui.label_* , ImageEnhance.Brightness ] ,
    [ self.ui.label_* , ImageEnhance.Contrast ] ,
    [ self.ui.label_* , ImageEnhance.Color ] ,       # 彩度
    [ self.ui.label_* , ImageEnhance.Sharpness ] ,
]


def *****(self,v):
 for l in self.list:
  if l[0] is self.sender() :
  ******
  break


画質の調整

  • 透明度アルファ付きのRGBに変換
    con4 = image1.convert('RGBA')

  • 彩度
    from PIL import ImageEnhance #ImageEnhanceのインポート
    con5 = ImageEnhance.Color(image1)
    con5_image = con5.enhance(0.4) # 1が基本
    <con5_image>

  • コントラストを調整
    con7 = ImageEnhance.Contrast(image1)
    con7_image = con7.enhance(0.5) # 1が基本
    <con7_image>

  • 明度
    con9 = ImageEnhance.Brightness(image1)
    con9_image = con9.enhance(0.5) # 1が基本
    con9_image

  • シャープネス
    con11 = ImageEnhance.Sharpness(image1)
    con11_image = con11.enhance(0.5)
    con11_image


pillowについて調べた


→ 目次に戻る