hogeoge enhancer version 11
hogeoge
todo
ホワイトポイント取得、範囲外は無視する
ベジェポイントの下を先に選択はできた
---
# フレームを塗る
QWidget.setStyleSheet (self, QString styleSheet)
QWidget.setStyle (self, QStyle)
QFrame{color:}
---
QWidget.setAutoFillBackground (self, bool enabled)
QWidget.setBackgroundRole (self, QPalette.ColorRole)
---
p = w.palette()
p.setColor(w.backgroundRole(), Qt.red)
w.setPalette(p)
setAutoFillBackground(True)
----
PyQt5.QtGui.QPalette
__init__
pal=QPalette()
pal.setColor(QPalette.Window , QColor(255,255,255))
self.ui.frame.setPalette (pal)
__after__
self.ui.frame.palette.setColor(QPalette.Window , QColor( *,:,:))
# HSV変換
①座標の色を取得したらすぐにHSV変換をして、データを self.hsv[] に保存して、スライダを self.hsv[2]*100 に設定する
②スライダルーチン
self.hsv[2] = i/100
color = hsv_to_rgb(self.hsv[0] , self.hsv[1] , i/100 )
color=[int(i*255) for i in color]
# frameの描画
# 色相補正 ヒストグラムマッチング
三色毎にヒストグラム最大値となるRGBを取得
そのRGB値が128となるよう直線で補正するテーブルを作成
そのテーブルで描画
```
def histogrammatch(self):
if self.ui.textctrl.getText() :
color = [ [],[],[] ]
his=[0,0,0,0]
his[0] = int( self.ui.textctrl.getText() ) # RED
his[1] = int( self.ui.textctrl.getText() ) # Green
his[2] = int( self.ui.textctrl.getText() ) # Blue
his[3] = int( self.ui.textctrl.getText() ) # default 128
for l in range(3):
ratio1 = his[3]/his[l] # left angle
ratio2 = ( 255-his[3] )/(255-his[l] ) # right angle
ratio3 = 255*(1-ratio2 ) # Y
color[l] = [ round(i*ratio1) if i< his[3] else round(i*ratio2+ratio3) for i in range(256) ]
else :
max=[0,0,0]
his=self.img.gethistogram()
for i,m in enumerate(his):
if i<256:
max[0]=m if m>max[0] else max[0]
elif i<512:
max[1]=m if m>max[1] else max[1]
else:
max[2]=m if m>max[2] else max[2]
self.ui.textctrl*.setText( str(max[0]) )
self.ui.textctrl*.setText( str(max[1]) )
self.ui.textctrl*.setText( str(max[2]) )
```
-----
# ヒストグラム表示修正
- 反転値は概ねwidgetの高さ、自由に変えれるようにグローバルにする
- ヒストグラムが反転値と等しいとき(0)は欠落したRGB値と見なして描画をパスする
ただし両端では実際に0は存在するのでそこもパスするのは間違ってるんだけど
- 一つ後のポイントとラインを引いていたがパスする可能性があるので直前の有効なポイントを記憶してそことのラインを引くように修正
```
# init
# self.rv=180 # reverse value ( height)
# red draw
cpoint=QPointF( 0 , self.rv ) # current point
painter.setPen( QPen( Qt.red , 2 ) )
for i in range(255):
if self.his[i] == self.rv :
continue
painter.drawLine( cpoint , QPointF( i , self.his[i] ) )
cpoint = QPointF( i , self.his[i] )
# green draw
cpoint=QPointF( 0 , self.rv ) # reset current point
```
---
# ベジェ曲線の座標の求め方について
- Qtはベジェ曲線を描画しているのだから座標も持ってるはずだと思いドキュメントを見てみたらこんなメッソドがあった
QPointF QPainterPath.pointAtPercent (self, float t)
このtは0-1で指定することになっていて、ベジェそのものですね
- Qtもあくまでtベースでしか値は返してくれないって事だな
内部的にはどういう実装なんだろう?
曲線とは言ってもPCだから全てはドットの描画でしかないはずだ
でもドットだとx値が飛ぶところでは間が空くはずだ
でもパスだからどんなに拡大しても綺麗に描画出来るように実装されてるはずだ
やはり全てのx値を計算して求めてるんだろうか?
だとしたらそういう関数を用意してくれても良いと思うんだが・・・
- 今は自分でx,yを求めてるが、Qtの関数を使ってみるか???
結果が同じかどうかを調べてみるとか・・・
意味ないかな?
todo
ホワイトポイント取得、範囲外は無視する
ベジェポイントの下を先に選択はできた
フレームを塗る
QWidget.setStyleSheet (self, QString styleSheet)
QWidget.setStyle (self, QStyle)
QFrame{color:}
QWidget.setAutoFillBackground (self, bool enabled)
QWidget.setBackgroundRole (self, QPalette.ColorRole)
p = w.palette()
p.setColor(w.backgroundRole(), Qt.red)
w.setPalette(p)
setAutoFillBackground(True)
PyQt5.QtGui.QPalette
init
pal=QPalette()
pal.setColor(QPalette.Window , QColor(255,255,255))
self.ui.frame.setPalette (pal)
after
self.ui.frame.palette.setColor(QPalette.Window , QColor( *,:,:))
HSV変換
①座標の色を取得したらすぐにHSV変換をして、データを self.hsv[] に保存して、スライダを self.hsv[2]100 に設定する
②スライダルーチン
self.hsv[2] = i/100
color = hsv_to_rgb(self.hsv[0] , self.hsv[1] , i/100 )
color=[int(i255) for i in color]
frameの描画
色相補正 ヒストグラムマッチング
三色毎にヒストグラム最大値となるRGBを取得
そのRGB値が128となるよう直線で補正するテーブルを作成
そのテーブルで描画
def histogrammatch(self):
if self.ui.textctrl.getText() :
color = [ [],[],[] ]
his=[0,0,0,0]
his[0] = int( self.ui.textctrl.getText() ) # RED
his[1] = int( self.ui.textctrl.getText() ) # Green
his[2] = int( self.ui.textctrl.getText() ) # Blue
his[3] = int( self.ui.textctrl.getText() ) # default 128
for l in range(3):
ratio1 = his[3]/his[l] # left angle
ratio2 = ( 255-his[3] )/(255-his[l] ) # right angle
ratio3 = 255*(1-ratio2 ) # Y
color[l] = [ round(i*ratio1) if i< his[3] else round(i*ratio2+ratio3) for i in range(256) ]
else :
max=[0,0,0]
his=self.img.gethistogram()
for i,m in enumerate(his):
if i<256:
max[0]=m if m>max[0] else max[0]
elif i<512:
max[1]=m if m>max[1] else max[1]
else:
max[2]=m if m>max[2] else max[2]
self.ui.textctrl*.setText( str(max[0]) )
self.ui.textctrl*.setText( str(max[1]) )
self.ui.textctrl*.setText( str(max[2]) )
ヒストグラム表示修正
- 反転値は概ねwidgetの高さ、自由に変えれるようにグローバルにする
- ヒストグラムが反転値と等しいとき(0)は欠落したRGB値と見なして描画をパスする
ただし両端では実際に0は存在するのでそこもパスするのは間違ってるんだけど - 一つ後のポイントとラインを引いていたがパスする可能性があるので直前の有効なポイントを記憶してそことのラインを引くように修正
# init
# self.rv=180 # reverse value ( height)
# red draw
cpoint=QPointF( 0 , self.rv ) # current point
painter.setPen( QPen( Qt.red , 2 ) )
for i in range(255):
if self.his[i] == self.rv :
continue
painter.drawLine( cpoint , QPointF( i , self.his[i] ) )
cpoint = QPointF( i , self.his[i] )
# green draw
cpoint=QPointF( 0 , self.rv ) # reset current point
ベジェ曲線の座標の求め方について
- Qtはベジェ曲線を描画しているのだから座標も持ってるはずだと思いドキュメントを見てみたらこんなメッソドがあった
QPointF QPainterPath.pointAtPercent (self, float t)
このtは0-1で指定することになっていて、ベジェそのものですね - Qtもあくまでtベースでしか値は返してくれないって事だな
内部的にはどういう実装なんだろう?
曲線とは言ってもPCだから全てはドットの描画でしかないはずだ
でもドットだとx値が飛ぶところでは間が空くはずだ
でもパスだからどんなに拡大しても綺麗に描画出来るように実装されてるはずだ
やはり全てのx値を計算して求めてるんだろうか?
だとしたらそういう関数を用意してくれても良いと思うんだが・・・ - 今は自分でx,yを求めてるが、Qtの関数を使ってみるか???
結果が同じかどうかを調べてみるとか・・・
意味ないかな?