[ todo ] pillow enhancer version 13
[ 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"
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 で書く
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
```
# PIL.Image と PyQt4.QtGui.QImageの相互変換
グラデ画像は逆変換になるな
http://doloopwhile.hatenablog.com/entry/20100305/1267782841
-------
# 画質の調整
- 透明度アルファ付きの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/
位置指定して小さい画像を貼り付けできる
----
→ [目次に戻る](https://mimemo.io/m/QORbW4qkvOoda0N)
項目グラデ関係PILでごにょごにょするPNGでエンコードグラデ マウス実装enhancer usagePIL.Image と PyQt4.QtGui.QImageの相互変換画質の調整pillowについて調べた
グラデ関係
マスク画像が変更されたらgradeクラスからメッセージをもらう
本体でマスクがオンなら描画する
まず画像を変換してself.maskにpilのimageをセットする
- 基本はこれだけど出来るかな?
左からのメッセージの受け関数をとりあえず作って
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 = "
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')
-
pillow 自分でグラデを書く
https://codeday.me/jp/qa/20190309/385657.html -
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
PIL.Image と PyQt4.QtGui.QImageの相互変換
グラデ画像は逆変換になるな
http://doloopwhile.hatenablog.com/entry/20100305/1267782841
画質の調整
-
透明度アルファ付きの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について調べた
-
エフェクトはここがわかりやすいね
Qtへの変換も
https://qiita.com/pashango2/items/145d858eff3c505c100a -
pil はQt変換を標準でサポートしてるのか??
https://dungeonneko.hatenablog.com/entry/2015/07/19/142034
Qpixmapに直接読み込むのとどっちが速いか試してみよう -
画像貼り付け
Python, Pillowで画像に別の画像を貼り付けるpaste
https://note.nkmk.me/python-pillow-paste/
位置指定して小さい画像を貼り付けできる
→ 目次に戻る