【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();
        }
时间: 2024-10-06 17:07:20

【WIN10】WIN2D——圖像處理的相关文章

線陣相機處理時間計算方法

線陣相機圖像處理時間計算,以xx案子為例, 相機使用16K線陣 最大速度300mm/s FOV 300mm 計算方法: 1,            每個像素點大小=FOV/像素數=300/16*1000 2,            行頻=速度/每個像素點大小=300/(300/16*1000) = 16*1000 3,            相機數據量=行頻*像素數 = (16*1000)*(16*1000) = 256*1,000,000 byte= 256M/S 此案子一秒最大能產生256M

在 Windows 上遇到非常多 TIME_WAIT 連線時應如何處理

我們公司所代管的網站裡,有幾個流量是非常大的,在尖峰的時刻同時上線人數可能高達數千到數萬人,而在這個時候如果使用 netstat 或 TCPView 查看所有 TCP 連線時就會看到非常多處於 TIME_WAIT 狀態的連線,平時就會多達數千條 TIME_WAIT 連線之多,尖峰的時候還有一萬多條 TIME_WAIT 連線的狀況,雖然這些連線目前還不致於造成連線發生問題,但基於一股好奇心才決定研究到底查探個究竟,深入研究後才得知這問題現在不處理,等網站流量在大一些的時候那就會出亂子了! 以下是用

使用google API之前需要對input 做什麼 安全性的處理?

我正要使用node.js 和 google map api做一个小应用,Google MAP API的使用URL如下: https://maps.googleapis.com/maps/api/place/textsearch/json?query=KEY+WORDS&key=YOUR_API_KEY KEY WORDS的部分将是我在我的应用上id="keywords"这个input的value HTML CODE: <form action="/api/goo

javaweb處理小數點前面的0顯示在頁面上

//格式化数字處理方式 DecimalFormat min=new DecimalFormat("0.00");   bd.setMin_aperture(min.format((rs.getDouble(26)))); //格式化数字 DecimalFormat max=new DecimalFormat("0.00");   bd.setMax_aperture(max.format((rs.getDouble(27)))); bd.setManufacture

NIO.2: 目錄的處理

檔案系統的 I/O,除了前幾篇所說明的檔案相關處理外,另一個主題就是目錄的處理 - 讀取.走訪.過濾檔案等,說明如下: 取得根目錄 1 package idv.steven.nio2.filedir; 2 3 import static java.lang.System.out; 4 import java.nio.file.FileSystems; 5 import java.nio.file.Path; 6 import java.util.ArrayList; 7 8 public cla

sort、join 處理 csv 檔案

雖然理想上,使用者要的資料最好都是由系統產生報表,使用者直接瀏覽或下載,但是,使用者常臨時要一些業績或管理性報表,IT 人員也只能從資料庫中下 sql statement 後匯出給使用者,有時,IT 人員更可能拿到別家公司匯出的數個 csv 檔,使用者卻希望將它們合併成一個檔案,當然,一般情況 IT 人員應該會找到一台資料庫,把檔案匯入處理後,再匯出給使用者,不過,IT 人員的環境裡並不總是有資料庫可以使用 (可能是控管嚴格沒有權限) ,這時候可以使用 Unix 中的一些指令來處理,Unix 通

C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem

原帖:https://tokyo.zxproxy.com/browse.php?u=uG7kXsFlW1ZmaxKEvCzu8HrCJ0bXIAddA1s5dtIUZ%2FYzM1u9JI7jjKLTXvXJlIqeavUo1Ak%3D&b=6 如果要在 C++ 裡對特定的檔案做存取,其實透過 STL 的 fstream(參考)來做,一般是不會有什麼問題的:相對的,問題比較大的部分,可能會是在於對於資料夾(folder.directory)的處理,以及對於路徑的操作上.像是以路徑來說,Windo

第七章 中斷和中斷處理

1. 異常和中斷 異常:必須考慮與處理器時鐘同步,由軟件產生,亦稱爲同步中斷.如除零異常和缺頁異常 中斷:由硬件產生的異步中斷 2. 中斷處理程序 中斷處理程序是被內核調用來響應中斷的,運行與中斷上文.中斷上下文又稱原子上下文,該上下文的執行代碼不可阻塞. 最起碼,中斷處理程序要負責通知硬件設備中斷已被接受:嗨,硬件,我聽到你了,現在回去工作吧! 3. 上半部和下半部 中斷處理程序是上半部(top half)——接收到一個中斷,它就立即開始執行,但只做有嚴格時限的工作,例如對接受的中斷進行應答或

Oracle Long 類型欄位處理

Long 數據類型的特點 1.LONG 数据类型中存储的是可变长字符串,最大长度限制是2GB. 2.对于超出一定长度的文本,基本只能用LONG类型来存储,数据字典中很多对象的定义就是用LONG来存储的.1.LONG 数据类型中存储的是可变长字符串,最大长度限制是2GB. 2.对于超出一定长度的文本,基本只能用LONG类型来存储,数据字典中很多对象的定义就是用LONG来存储的. 3.LONG类型主要用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型. 4.很多工具,包括