hogeoge enhancer version 10

2019/07/09 17:16 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
hogeoge
# フレームを塗る
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の関数を使ってみるか???
結果が同じかどうかを調べてみるとか・・・
意味ないかな? 

      

フレームを塗る

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の関数を使ってみるか???
    結果が同じかどうかを調べてみるとか・・・
    意味ないかな?