DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33450 / inTopicNo.1)  vb.netでの彩度調整
  
□投稿者/ kawori 一般人(1回)-(2016/08/14(Sun) 18:14:24)
  • アイコン環境/言語:[vb.net] 
    分類:[.NET] 

    Windows10(64bit)、VisualStudio2015使用です。
    現在、画像ビューワを作成中です。その中で、色調整の一環にhttp://dobon.net/vb/dotnet/graphics/saturation.htmlを参考に彩度調整機能をトラックバーに持たせようとしたのですが、スライダーを+に動かすと緑寄り、-に動かすと赤寄りに画像全体の色調が移動して表示されます。ダイアログ内に変更前画像表示用のPictureBox1と変更後画像表示用のPictureBox2、彩度装置用のTrackBarとNumericUpDownを設置し、以下の様にコード組んだのですが、何処に間違い有るでしょうか。添削願います。

    Public Shared Function ChangeContrast(ByVal img As Image, ByVal contrast As Single) As Image
    Dim newImg As New Bitmap(img.Width, img.Height)
    Dim g As Graphics = Graphics.FromImage(newImg)
    Dim scale As Single = (100.0F + contrast) / 100.0F
    scale *= scale
    Dim append As Single = 0.5F * (1.0F - scale)
    Dim cm As New System.Drawing.Imaging.ColorMatrix(New Single()() {
    New Single() {scale, 0, 0, 0, 0}, New Single() {0, scale, 0, 0, 0}, New Single() {0, 0, scale, 0, 0}, New Single() {0, 0, 0, 1, 0}, New Single() {append, append, append, 0, 1}})
    Dim ia As New System.Drawing.Imaging.ImageAttributes()
    ia.SetColorMatrix(cm)
    g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia)
    g.Dispose()
    Return newImg
    End Function
    Private Sub NumericUpDown5_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown5.ValueChanged
    TrackBar5.Value = NumericUpDown5.Value
    End Sub
    Private Sub TrackBar5_Scroll(sender As Object, e As EventArgs) Handles TrackBar5.Scroll
    Dim ChangeSaturationImg As New Bitmap(PictureBox1.Image)
    Dim newImg As Image = ChangeSaturation(ChangeSaturationImg, Decimal.ToSingle(TrackBar5.Value))
    ChangeSaturationImg.Dispose()
    If Not PictureBox2.Image Is Nothing Then
    PictureBox2.Image.Dispose()
    End If
    PictureBox2.Image = newImg
    NumericUpDown5.Value = TrackBar5.Value
    End Sub
引用返信 削除キー/
■33451 / inTopicNo.2)  Re[1]: vb.netでの彩度調整
□投稿者/ Hongliang 大御所(521回)-(2016/08/14(Sun) 21:13:57)
  • アイコンDobonのページと比較して、ColorMatrixの構成要素が全く異なっているように見受けられますが…?
引用返信 削除キー/
■33452 / inTopicNo.3)  Re[1]: vb.netでの彩度調整
□投稿者/ Azulean 大御所(471回)-(2016/08/14(Sun) 21:19:19)
  • アイコンすでに指摘があるように、元のサンプルコードは単純なスケーリングではありません。
    定数(0.3086, 0.6094, 0.820)と絡めた演算をした結果を、行列の特定の位置に入れる必要があります。
    もう一度、コードをきちんと読み直しましょう。

    また、ColorMatrix について別に説明されたページがありますので、こちらを参考に、行列の計算を思い浮かべてください。
    http://dobon.net/vb/dotnet/graphics/colorbalance.html
引用返信 削除キー/
■33453 / inTopicNo.4)  Re[2]: vb.netでの彩度調整
□投稿者/ kawori 一般人(2回)-(2016/08/14(Sun) 22:19:16)
  • アイコン失礼致しました。ColorMatrix入りのコードはこちらです。間違った物をコピペした様です。申し訳ありませんが、宜しく絵願いします。
    Public Shared Function ChangeSaturation(ByVal img As Image, ByVal saturation As Single) As Image
    Dim newImg As New Bitmap(img.Width, img.Height)
    Dim g As Graphics = Graphics.FromImage(newImg)
    Dim cm As New Imaging.ColorMatrix()
    Const rwgt As Single = 0.3086F
    Const gwgt As Single = 0.6094F
    Const bwgt As Single = 0.082F
    cm.Matrix01 = (1.0F - saturation) * rwgt
    cm.Matrix02 = cm.Matrix01
    cm.Matrix00 = cm.Matrix01 + saturation
    cm.Matrix10 = (1.0F - saturation) * gwgt
    cm.Matrix12 = cm.Matrix10
    cm.Matrix11 = cm.Matrix10 + saturation
    cm.Matrix20 = (1.0F - saturation) * bwgt
    cm.Matrix21 = cm.Matrix20
    cm.Matrix22 = cm.Matrix20 + saturation
    cm.Matrix33 = 1
    cm.Matrix44 = 1
    Dim ia As New Imaging.ImageAttributes()
    ia.SetColorMatrix(cm)
    g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia)
    g.Dispose()
    Return newImg
    End Function
引用返信 削除キー/
■33454 / inTopicNo.5)  Re[3]: vb.netでの彩度調整
□投稿者/ Azulean 大御所(472回)-(2016/08/14(Sun) 22:59:07)
  • アイコン2016/08/14(Sun) 23:13:41 編集(投稿者)

    予想するに、saturation の数値が大きすぎる、範囲設定が怪しいのでは?
    TrackBar は整数単位となりますので、彩度として適切な換算をかけてやらないといけないと考えられます。

    saturation = 0.0 でグレースケールの絵になる、saturation = 1.0 で元の絵になりますので、TrackBar の Value をそのまま Single に変換しているだけではうまく調整できません。
    たとえば、割り算を使って、0.1 単位、あるいは 0.01 単位といったスケールで数値を指定する必要があるはずです。

    ところで、マイナスの場合にどういった絵を期待しているのでしょうか?
    参考事例として、手元のペイントソフトでは GUI から指定できるレンジを -100 〜 100 とし、-100 を グレースケール、0 を 元の絵という仕様、つまり、saturation = 0.0 を下限としていると思われる結果であったたためです。
引用返信 削除キー/
■33455 / inTopicNo.6)  Re[4]: vb.netでの彩度調整
□投稿者/ kawori 一般人(3回)-(2016/08/15(Mon) 18:46:42)
  • アイコンレス有難うございます。
    作成時私が考えていた彩度調整は、Phptoshopと同形式の変更前が0、-100でグレースケールという物でした。
    試しに「Decimal.ToSingle(TrackBar5.Value)」の部分を「Decimal.ToSingle(TrackBar5.Value)*0.01」に変えてみると、御推測通り変更前が100、変更後が0になりました。
    その結果とお言葉を踏まえ、「Decimal.ToSingle(TrackBar5.Value)」の部分を「Decimal.ToSingle(TrackBar5.Value)*0.01+1」に変えると、Phptoshopと同様のTrackBar値となりました。これで解決です。有難うございます。
    次回質問の際は又宜しくお願いします。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -