Lesson3

Lesson3 Adjustments

画像の明るさ(輝度)、彩度を調整します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. PhotoAdjustment.sln から起動して、Lesson3.Adjustments を右クリックします。
    メニューから「スタートアップ プロジェクトに設定」を選びます。
    そのまま右三角アイコンでコンパイル&実行して下さい。
    ウインドウサイズに合わせて、イメージが描画されます。
    マウスを左右にドラッグすると、画像の明るさ(輝度)が変わります。
    上下にドラッグすると、彩度が変わります。
  2. PhotoRenderer.cpp をダブルクリックして、ソースコードを表示して下さい。
    Run() メソッドには、Lesson2 と違ってレンダリングループが設定されていません。
    今回のような基本的な操作は、ループを設定する必要は無いようです。
    void PhotoRenderer::Run()
    {
        Render();
    
        // ProcessUntilQuit blocks until the app closes (while still firing input events).
        m_window->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessUntilQuit);
    }
    
  3. Image を描画する Render() メソッドは Lesson2 と同じです。
    void PhotoRenderer::Render()
    {
        m_d2dContext->BeginDraw();
    
        m_d2dContext->DrawImage(
            m_2dTransformEffect.Get(),
            D2D1_INTERPOLATION_MODE_LINEAR,
            D2D1_COMPOSITE_MODE_SOURCE_COPY
            );
    
        HRESULT hr = m_d2dContext->EndDraw();
        if (hr != D2DERR_RECREATE_TARGET)
        {
            DX::ThrowIfFailed(hr);
        }
    
        m_sampleOverlay->Render();
    
        Present();
    }
    
  4. 輝度と彩度の領域です。
      static const float SaturationDefault = 1.0f;
      m_saturation = SaturationDefault;
    
      static const float BrightnessDefault = 0.5f;
      m_brightness = BrightnessDefault;
    
  5. OnManipulationUpdated() で輝度と彩度を調整しているようです。
    void PhotoRenderer::OnManipulationUpdated(
        _In_ Windows::UI::Input::GestureRecognizer^ recognizer,
        _In_ Windows::UI::Input::ManipulationUpdatedEventArgs^ args
        )
    {
        Point positionDelta = args->Delta.Translation;
    
        m_saturation = Clamp(m_saturation - positionDelta.Y / m_contextSize.height, 0.0f, 1.0f);
        m_brightness = Clamp(m_brightness + positionDelta.X / m_contextSize.width, 0.2f, 0.8f);
    
        UpdateAdjustmentEffectValues();
    
        Render();
    }
    
  6. OnManipulationUpdated() は SetWindow() で登録されています。
    void PhotoRenderer::SetWindow(
        _In_ CoreWindow^ window
        )
    {
        ・・・
    
        m_gestureRecognizer->ManipulationUpdated +=
            ref new TypedEventHandler<GestureRecognizer^, ManipulationUpdatedEventArgs^>(
                this,
                &PhotoRenderer::OnManipulationUpdated
                );
    
        DirectXBase::Initialize(window, DisplayProperties::LogicalDpi);
    }
    

超初心者のプログラム入門(DirectX Store)