none
CDC::SetColorAdjustmentでコントラストを変えようとすると明るさも同時に変わる事を回避したい RRS feed

  • 質問

  • VisualStudio2019 のMFCでソフトを開発しております。 (Win10)

    表題通りですが、
    Bitmap画像をCDC::SetColorAdjustmentで調整して、CDC::StretchBltで画面表示しています。

    CDC::SetColorAdjustmentにあたえているCOLORADJUSTMENTのcaBrightnessやcaColorfulnessなどは期待どうりに動いているのですが、caContrastがcaBrightnessとほぼ同じような動きになってます。
    (caContrast=-100だと全体に真っ暗、 100だと超明るくなります。   caBrightnessとの違いは極少しだけコントラスタが上がったように見えます)


    WindowsのPaint.NETや、PhotoShopなどを使って画像を明るさ/コントラスト調整すると、明るさはキーブしたままコントラストだけ増減するような挙動になっているので出来ればこれと同じような挙動を実現したいです。

    SetColorAdjustmentを使い(これで無理ならその他の方法でも)Paint.NETやPhotoShopのように明るさをキープしたままコントラストの増減ができる方法があればご教授ください。

    はしょってますがこんな感じです。

    CDC *drawDC = new CDC(); HDC hDCDraw = drawDC->GetSafeHdc(); :SetStretchBltMode(hDCDraw, STRETCH_HALFTONE); COLORADJUSTMENT colorAdjustment; colorAdjustment.caSize = sizeof(COLORADJUSTMENT); colorAdjustment.caContrast = contrast; // コントラスト -100~100 colorAdjustment.caBrightness = bright; // 明るさ -100~100 colorAdjustment.caColorfulness = 0; // 彩度: -100~100 ::SetColorAdjustment(hDCDraw, &colorAdjustment); // hMemDC : 画像 ::StretchBlt(hDCDraw, 0, 0, width, height, hMemDC, 0, 0, width, height, , SRCCOPY);





    2021年11月16日 0:03

回答

  • Freeプログラマーさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    C++で実行する方法を見つけました。
    このリンク(英語サイト)をご参照のほどお願いします。


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年11月24日 9:01
    モデレータ

すべての返信

  • Freeプログラマーさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    二つのスライダーコントロールで、それぞれ明るさとコントラストを設定することをお勧めします。
    SetRange関数でrangeを設定し、GetPosの戻り値がintです。この関数を使用して明るさまたはコントラストを取得できます。
    下記のコードをご参照ください。
    CSliderCtrl CON;
    
    CON.SetRange(0, 100);
    contrast = CON.GetPos();

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年11月22日 9:09
    モデレータ
  • Kumo様、
    返信して頂いて申し訳ないですが、
    いただいた回答の内容は添付したソースの上位ですでに行っております。

    この質問はCSliderCtrlの使い方等ではなくて、
    CDC::SetColorAdjustmentを使ってcaBrightnessが0固定でcaContrast だけを変えても、明暗が変わってコントラストがほとんど変わらないので、明暗を保持したままコントラストを変える方法はないか? という内容です。


    2021年11月22日 17:10
  • Freeプログラマーさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    こちらでテストして、同じ結果を得ました。
    したがって、BrightnessContrastParamsという方法を試してみてはいかがでしょう。
    この方法で画像の明るさとコントラストを変更することができます。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年11月23日 9:47
    モデレータ
  • Kumo様
    情報ありがとうございました。

    試しました。
    確かに、BrightnessContrastParamsで明るさ/コントラストが効きました。

    しかしGDI+を使っているので表示速度が遅いため対象としているソフトでは問題になるかもしれません。 この辺りはもう少しテストします。

    (対象ソフトは動画ソフトで それの表示部にこの機能が必要になってます)

    GDI+でなくてCDC::SetColorAdjustment並みに高速なのがあればいいのですが。
    (とりあえず自作でRGBを変更する方法も進めています)




    2021年11月23日 11:27
  • Freeプログラマーさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    C++で実行する方法を見つけました。
    このリンク(英語サイト)をご参照のほどお願いします。


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年11月24日 9:01
    モデレータ
  • Freeプログラマーさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    C++で実行する方法を見つけました。
    このリンク(英語サイト)をご参照のほどお願いします。


    ありがとうございました。

    少々時間がかかりそうですが、進捗があったらご報告します。

    2021年11月24日 10:04
  • リンクのサイトではないですが、比較的簡易にコントラストを上げる方法がありました。

    こんな感じです。 (contrast=-100~100)
    float contrastFactor = ( 259.0 * ( (float)contrast + 255.0 ) ) / ( 255.0 * ( 259.0 - (float)contrast ) );
    RGBそれぞれ =contrastFactor * ( RGB値- 128 ) + 128;


    BitmapからGetDIBitsでデータを得て、上記計算式でRGBを変えてSetDIBitsでデータを戻してBitBltで描画するようにしたので速度的にも良さそうでした。

    2021年11月27日 5:20