• 【WIN10】WIN2D——圖像處理


    源碼下載:http://yunpan.cn/c3iNuHFFAcr8h  访问密码 8e48

    還是先來看下截圖:

    實現了幾個效果:放大、縮小、旋轉、左右翻轉、上下翻轉,亮度變化、灰度圖、對比度、高斯模糊。

    放大、縮小代碼:

    private void scale(float x)
    {
        scale_ *= x;
        using (var ds = board_.CreateDrawingSession())
        {
            ds.Transform = Matrix3x2.CreateScale(scale_);
            ds.Clear(Colors.Black);
            ds.DrawImage(oriImage_);
        }
    
        transform.Invalidate();
    }
    
    private void zoomIn_Click(object sender, RoutedEventArgs e)
    {
        scale(1.1f);
    }
    
    private void zoomOut_Click(object sender, RoutedEventArgs e)
    {
        scale(1 / 1.1f);
    }

    旋轉代碼(注意,默認轉動方向是鐘錶方向——順時針):

    private void rotate_Click(object sender, RoutedEventArgs e)
    {
        rotate_radians_ += 90;
        using (var ds = board_.CreateDrawingSession())
        {
            ds.Transform = Matrix3x2.CreateRotation(rotate_radians_ * (float)Math.PI / 180, new Vector2((float)oriImageRc_.Width / 2.0f, (float)oriImageRc_.Height / 2.0f));
            ds.Clear(Colors.Black);
            ds.DrawImage(oriImage_);
        }
    
        transform.Invalidate();
    }

    左右、上下翻轉代碼:

    private void left_right_Click(object sender, RoutedEventArgs e)
    {
        left_right_direction_ = -left_right_direction_;
    
        using (var ds = board_.CreateDrawingSession())
        {
            ds.Transform = Matrix3x2.CreateScale(new Vector2(left_right_direction_, top_bottom_direction_), new Vector2((float)oriImageRc_.Width / 2.0f, (float)oriImageRc_.Height / 2.0f));
            ds.Clear(Colors.Black);
            ds.DrawImage(oriImage_);
        }
    
        transform.Invalidate();
    }
    
    private void top_bottom_Click(object sender, RoutedEventArgs e)
    {
        top_bottom_direction_ = -top_bottom_direction_;
    
        using (var ds = board_.CreateDrawingSession())
        {
            ds.Transform = Matrix3x2.CreateScale(new Vector2(left_right_direction_, top_bottom_direction_), new Vector2((float)oriImageRc_.Width / 2.0f, (float)oriImageRc_.Height / 2.0f));
            ds.Clear(Colors.Black);
            ds.DrawImage(oriImage_);
        }
    
        transform.Invalidate();
    }

    亮度、灰度、對比度、高斯,均使用Effect效果,其效果放在名字空間:

    Microsoft.Graphics.Canvas.Effects

    具體代碼:

    亮度,注意,我使用了WhitePoint,還有BlackPoint,請讀者自己試驗效果。而且亮度的範圍為:[0-1),注意閉包關係。

    private void lightSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
            {
                if (board_ == null) return;
    
                using (var ds = board_.CreateDrawingSession())
                {
                    Microsoft.Graphics.Canvas.Effects.BrightnessEffect brightness = new Microsoft.Graphics.Canvas.Effects.BrightnessEffect();
                    if (e.NewValue >= 0.000001)
                    {
                        brightness.WhitePoint = new Vector2(0, (float)e.NewValue);
                    }
                    else
                    {
                        brightness.WhitePoint = new Vector2(-(float)e.NewValue, 0);
                    }
    
                    brightness.Source = oriImage_;
    
                    ds.Clear(Colors.Black);
                    ds.DrawImage(brightness);
                }
    
                transform.Invalidate();
            }

    灰度:

            private void gray_Click(object sender, RoutedEventArgs e)
            {
                Microsoft.Graphics.Canvas.Effects.GrayscaleEffect grayEffect = new Microsoft.Graphics.Canvas.Effects.GrayscaleEffect();
                grayEffect.Source = oriImage_;
    
                using (var ds = board_.CreateDrawingSession())
                {
                    ds.Clear(Colors.Black);
                    ds.DrawImage(grayEffect);
                }
                transform.Invalidate();
            }

    對比度:

            private void constrastSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
            {
                if (board_ == null) return;
    
                Microsoft.Graphics.Canvas.Effects.ContrastEffect constrastEffect = new Microsoft.Graphics.Canvas.Effects.ContrastEffect();
                constrastEffect.Contrast = (float)e.NewValue;
                constrastEffect.Source = oriImage_;
    
                using (var ds = board_.CreateDrawingSession())
                {
                    ds.Clear(Colors.Black);
                    ds.DrawImage(constrastEffect);
                }
                transform.Invalidate();
            }

    高斯:

    private void gaussianSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
            {
                if (board_ == null) return;
    
                Microsoft.Graphics.Canvas.Effects.GaussianBlurEffect gaussianEffect = new Microsoft.Graphics.Canvas.Effects.GaussianBlurEffect();
                gaussianEffect.BlurAmount = (float)e.NewValue;
                gaussianEffect.Source = oriImage_;
    
                using (var ds = board_.CreateDrawingSession())
                {
                    ds.Clear(Colors.Black);
                    ds.DrawImage(gaussianEffect);
                }
                transform.Invalidate();
            }
  • 相关阅读:
    4.9Java学习
    我晕了
    注意的
    语句
    第三天JAVA
    JAVA的学习
    JAVA的继承
    JAVA构造方法
    怎么去理解JAVA中类与对象的关系
    Java中三种比较常见的数组排序
  • 原文地址:https://www.cnblogs.com/lin277541/p/5068410.html
Copyright © 2020-2023  润新知