hogeoge enhancer version 17
hogeoge
todo
ホワイトポイント取得、範囲外は無視する
```
r=QRect( QPoint(0,340) , QPoint( self.imag.width , self.img.height )
if not r.containes(e.pos()) :
if not r.contains(e.pos()) :
return
```
----
※ 色が変わるのは、初期・親から・スライダーの三パターンのみ
最初の二回は全て変える、最後はスライダー以外を変える
フラグ切り替え時はスライダーのみ変える
def init
各種初期設定、パーツをリスト化
def setcolor(self , c) : # from parent , mode changed
色をもらってセルフに競って、パラメータ設定、スライダー設定
def setparam():
Qcolorから色情報設定
再描画、パラメータ設定、シグナル発行
def setslider(self): # set slder position
スライダー位置設定
def changemode(self): # radio connect
ラジオ取得してモード切替、スライダー設定、スライダーラベル変更
第三スライダーの最大値変更(255-359)
def getslider():
スライダー値の読み取り、色取得 → パラメータ設定
```
def init
self.flag=0 # hsv:0 rgb:1
self.color=[ QColor(0,0,0) , [0,0,0] , [0,0,0] ,['h','s','v'] , ['r','g','b'] ] # 色情報
self.setcolor(QCloror(125,125,125))
self.slider=[self.hSlider , self.hSlider_1 ,self.hSlider_2]
self.label= [[self.label,self.label_2,self.label_3],[self.label_4,self.label_5,self.label_6],
[self.label_7,self.label_8,self.label_9]]
def setcolor(self , c) : # from parent , mode changed
self.color[0]=c
self.setparam()
self.setslider()
def setparam():
self.color[1][0]=self.color[0].red()
self.color[1][1]=self.color[0].green()
self.color[1][2]=self.color[0].blue()
self.color[2][0],self.color[2][1],self.color[2][2],a = self.color.getHsv()
for i in range(3)
self.label[0][i].setText( str(self.color[1][i])) # rgb value
self.label[1][i].setText( str(self.color[2][i])) # hsv value
self.update()
self.colorchanged.emit(self.color)
def setslider(self): # set slder position
l= self.color[1] if self.flag else self.color[2]
for i in range(3):
self.slider[i].setValue( l[i] )
def changemode(self): # radio connect
self.flag = 0 if self.radio.isChecked() else 1 # default HSV
l=255 if self.flag else 359
self.slider[2].setMaximum(l)
self.setslider()
for i in range(3)
self.label[2][i].setText( str(self.color[self.flag + 3][i])) # rgb or hsv
def getslider():
l=[ i.value() for i in self.slider ]
if self.flag: # 1
self.color=QColor( l[0],l[1],l[2] )
else:
self.color=QColor.fromHsv( l[0],l[1],l[2] )
self.setparam()
```
----
# ホワイトポイント補正
今は白に補正しているが、任意の色に補正したい(肌色を保存しておきたい)
HSV全て調節できるようにしたい
# 三色独立したベジェカーブ
・フォルダを全く別に作って開発しよう、ベースは引き継ぐが不要なクラスは削除
・現在のUIを変更、下にカーブを三つおいた。左に元画像を置く
・ベジェクラスは最初に本体から自分の色をもらって、その色でカーブを描画して本体にデータを送る
・本体は bezie 関数でデータを受けて、LUTを作る。sender() で色を判定する
・テーブルは self.LUT[[256],[256],[256]] で、initで直線データで初期化しておく
・bezie 関数は一度に一色のデータ変更しか受け付けない
・bezie 関数でLUTを作ったらすぐに変換後の画像を作って( self.img → self.enhanced )update でdrawを呼ぶ
・ヒストグラムの単純な平行移動ルーチンを作りたい
・三色のシンクロモードを作りたい
・マスクをかけないので enhanced と current は等しいから、どっちか削除でも良いかな
```
# 初期化
self.LUT = [ [i for i in range(256)] for l in range(3) ]
# 平行移動 +a
# スライダー置いてコネクト、0-300、150に設定
def parallel( self , a ):
a = a-150
if a > 0 :
self.LUT[0] = [i+a if i+a <256 else 255 for i in range(256) ]
self.LUT[0][0]=0
else :
self.LUT[1] = [i+a if i+a >0 else 0 for i in range(256) ]
```
----
# ベジェ曲線の座標の求め方について
- Qtはベジェ曲線を描画しているのだから座標も持ってるはずだと思いドキュメントを見てみたらこんなメッソドがあった
QPointF QPainterPath.pointAtPercent (self, float t)
このtは0-1で指定することになっていて、ベジェそのものですね
- Qtもあくまでtベースでしか値は返してくれないって事だな
内部的にはどういう実装なんだろう?
曲線とは言ってもPCだから全てはドットの描画でしかないはずだ
でもドットだとx値が飛ぶところでは間が空くはずだ
でもパスだからどんなに拡大しても綺麗に描画出来るように実装されてるはずだ
やはり全てのx値を計算して求めてるんだろうか?
だとしたらそういう関数を用意してくれても良いと思うんだが・・・
- 今は自分でx,yを求めてるが、Qtの関数を使ってみるか???
結果が同じかどうかを調べてみるとか・・・
意味ないかな?
todo
ホワイトポイント取得、範囲外は無視する
r=QRect( QPoint(0,340) , QPoint( self.imag.width , self.img.height )
if not r.contains(e.pos()) :
return
※ 色が変わるのは、初期・親から・スライダーの三パターンのみ
最初の二回は全て変える、最後はスライダー以外を変える
フラグ切り替え時はスライダーのみ変える
def init
各種初期設定、パーツをリスト化
def setcolor(self , c) : # from parent , mode changed
色をもらってセルフに競って、パラメータ設定、スライダー設定
def setparam():
Qcolorから色情報設定
再描画、パラメータ設定、シグナル発行
def setslider(self): # set slder position
スライダー位置設定
def changemode(self): # radio connect
ラジオ取得してモード切替、スライダー設定、スライダーラベル変更
第三スライダーの最大値変更(255-359)
def getslider():
スライダー値の読み取り、色取得 → パラメータ設定
def init
self.flag=0 # hsv:0 rgb:1
self.color=[ QColor(0,0,0) , [0,0,0] , [0,0,0] ,['h','s','v'] , ['r','g','b'] ] # 色情報
self.setcolor(QCloror(125,125,125))
self.slider=[self.hSlider , self.hSlider_1 ,self.hSlider_2]
self.label= [[self.label,self.label_2,self.label_3],[self.label_4,self.label_5,self.label_6],
[self.label_7,self.label_8,self.label_9]]
def setcolor(self , c) : # from parent , mode changed
self.color[0]=c
self.setparam()
self.setslider()
def setparam():
self.color[1][0]=self.color[0].red()
self.color[1][1]=self.color[0].green()
self.color[1][2]=self.color[0].blue()
self.color[2][0],self.color[2][1],self.color[2][2],a = self.color.getHsv()
for i in range(3)
self.label[0][i].setText( str(self.color[1][i])) # rgb value
self.label[1][i].setText( str(self.color[2][i])) # hsv value
self.update()
self.colorchanged.emit(self.color)
def setslider(self): # set slder position
l= self.color[1] if self.flag else self.color[2]
for i in range(3):
self.slider[i].setValue( l[i] )
def changemode(self): # radio connect
self.flag = 0 if self.radio.isChecked() else 1 # default HSV
l=255 if self.flag else 359
self.slider[2].setMaximum(l)
self.setslider()
for i in range(3)
self.label[2][i].setText( str(self.color[self.flag + 3][i])) # rgb or hsv
def getslider():
l=[ i.value() for i in self.slider ]
if self.flag: # 1
self.color=QColor( l[0],l[1],l[2] )
else:
self.color=QColor.fromHsv( l[0],l[1],l[2] )
self.setparam()
ホワイトポイント補正
今は白に補正しているが、任意の色に補正したい(肌色を保存しておきたい)
HSV全て調節できるようにしたい
三色独立したベジェカーブ
・フォルダを全く別に作って開発しよう、ベースは引き継ぐが不要なクラスは削除
・現在のUIを変更、下にカーブを三つおいた。左に元画像を置く
・ベジェクラスは最初に本体から自分の色をもらって、その色でカーブを描画して本体にデータを送る
・本体は bezie 関数でデータを受けて、LUTを作る。sender() で色を判定する
・テーブルは self.LUT[[256],[256],[256]] で、initで直線データで初期化しておく
・bezie 関数は一度に一色のデータ変更しか受け付けない
・bezie 関数でLUTを作ったらすぐに変換後の画像を作って( self.img → self.enhanced )update でdrawを呼ぶ
・ヒストグラムの単純な平行移動ルーチンを作りたい
・三色のシンクロモードを作りたい
・マスクをかけないので enhanced と current は等しいから、どっちか削除でも良いかな
# 初期化
self.LUT = [ [i for i in range(256)] for l in range(3) ]
# 平行移動 +a
# スライダー置いてコネクト、0-300、150に設定
def parallel( self , a ):
a = a-150
if a > 0 :
self.LUT[0] = [i+a if i+a <256 else 255 for i in range(256) ]
self.LUT[0][0]=0
else :
self.LUT[1] = [i+a if i+a >0 else 0 for i in range(256) ]
ベジェ曲線の座標の求め方について
- Qtはベジェ曲線を描画しているのだから座標も持ってるはずだと思いドキュメントを見てみたらこんなメッソドがあった
QPointF QPainterPath.pointAtPercent (self, float t)
このtは0-1で指定することになっていて、ベジェそのものですね - Qtもあくまでtベースでしか値は返してくれないって事だな
内部的にはどういう実装なんだろう?
曲線とは言ってもPCだから全てはドットの描画でしかないはずだ
でもドットだとx値が飛ぶところでは間が空くはずだ
でもパスだからどんなに拡大しても綺麗に描画出来るように実装されてるはずだ
やはり全てのx値を計算して求めてるんだろうか?
だとしたらそういう関数を用意してくれても良いと思うんだが・・・ - 今は自分でx,yを求めてるが、Qtの関数を使ってみるか???
結果が同じかどうかを調べてみるとか・・・
意味ないかな?