C#圖片色彩的糾正-上

WPF(C#)圖片色彩的糾正-上html

WPF(C#)圖片色彩的糾正-下sql

前言數據庫

  對圖片進行色彩的糾正,其實與WPF是沒有什麼關係的,爲何標題又是「WPF(C#)圖片色彩的糾正」呢,由於這些圖片色彩的糾正功能都是承載在WPF界面上的,而且我也很想介紹一些關於WPF方面的知識,因此就命名了此標題。asp.net

  這個軟件的主要功能是經過設置Tint, BlackEnhance, ColorVibrancy, Automatic, Sharpen, Depth,Bias等參數來對圖片的色彩進行糾正(參數屬於專業領域詞彙,爲了不翻譯不許確,就不翻譯了),而且把最優的參數保存在本地的Sqlite數據庫裏,方便同類型的圖片調用相同的參數。蒼白的描述,總趕不上配幾個圖片來表達一下個人意思。ide

圖一:開始界面網站

圖二:設置界面this

圖三:全景界面spa

 技術點描述.net

色彩糾正方面的內容涉及到較多的數學公式,在後面的博客中將做深刻描述,此篇主要描述以下幾個技術點:翻譯

一、系統兼容性(Sqlite x64, x86的兼容)

  Sqlite是一個嵌入式開發用的較多的數據庫,咱們能夠在官方網站下載,下載頁面上羅列出了幾十個連接,咱們必定要精準的找到本身所須要的連接,點擊Precompiled Binaries for .NET下的連接,看到以下的截圖內容

開發環境是32位機的選擇sqlite-netFx40-setup-x86-2010-1.0.96.0.exe ,開發環境是64位機的選擇sqlite-netFx40-setup-x64-2010-1.0.96.0.exe連接進行下載。

當成功安裝下載程序後,到安裝目錄(盤符:\Program Files\System.Data.SQLite\2010\bin)下拷貝 SQLite.Interop.dll 和 System.Data.SQLite.dll兩個文件,注意,SQLite.Interop.dll是Sqlite跨x64,x86的關鍵所在。小提示,在作Sqlite批量插入時,記得必定要加上顯示事務,若是不加上顯示事務,是插入一條提交一條,加上了顯示事務,是全部的都插入完成後,再提交事務,顯而易見,後一種方法較前一種方法快。

二、把C#的枚舉類型綁定到ComboBox

  Combobox是WPF中的下拉列表框控件,在HTML是<select></select>,在asp.net中又叫DropDownList,名字不同,可是表現形式都差很少,就是列一堆數據出來,讓你選擇其中一個。有時候須要把一個枚舉類型做爲數據源綁定到控件上,在不一樣的開發模式中綁定方法也有區別,我如今只說在WPF下怎樣將一個枚舉類型的數據綁定到ComboBox上。

先用C#定義一個枚舉類型

public enum AGGRESSIVENESS
{
    CONSERVATIVE,
    MODERATE,
    AGGRESSIVE,
    AGGRESSIVENESS_MAXCOUNT
};

而後在XAML裏添加枚舉引用

<Window.Resources>
    <ObjectDataProvider x:Key="odpAggressiveness" MethodName="GetValues"
                        ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:AGGRESSIVENESS"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

在XAML裏ComboBox綁定一個枚舉類型

<ComboBox x:Name="comboEAggressiveness" Grid.Row="1" Grid.Column="6" 
          VerticalAlignment="Center"   
          Style="{DynamicResource VirtualisedMetroComboBox}"
          ItemsSource="{Binding Source={StaticResource odpAggressiveness}}" 
          SelectedItem="{Binding Path=CurrentAGGRESSIVENESSData,Mode=TwoWay}" />

這樣經過簡單的三步操做,就能將一個枚舉類型綁定爲一個ComboBox的數據源。

三、桌面與窗體之間的文件拖拽

  如今不少軟件都有桌面與窗體之間的文件拖拽功能,好比百度雲就支持此功能,在WPF中實現此功能,就像站着屙尿同樣容易啊,只要把窗體的屬性設置爲 AllowDrop="True" 而後再註冊Drop="thisWindow_Drop"事件,事件代碼以下:

private void thisWindow_Drop(object sender, DragEventArgs e)
{
    var data = e.Data as DataObject;
    if (data.ContainsFileDropList())
    {
        System.Collections.Specialized.StringCollection files = data.GetFileDropList();
        String fileExtension = System.IO.Path.GetExtension(files[0]);
        if (fileExtension.Equals(".BMP", StringComparison.CurrentCultureIgnoreCase)
            || fileExtension.Equals(".JPG", StringComparison.CurrentCultureIgnoreCase)
            || fileExtension.Equals(".JPEG", StringComparison.CurrentCultureIgnoreCase)
            || fileExtension.Equals(".GIF", StringComparison.CurrentCultureIgnoreCase)
            || fileExtension.Equals(".PNG", StringComparison.CurrentCultureIgnoreCase)
            || fileExtension.Equals(".TIFF", StringComparison.CurrentCultureIgnoreCase)
            )
        {
            BitmapImage img = new BitmapImage();
            img.BeginInit();
            img.CacheOption = BitmapCacheOption.OnLoad;
            img.UriSource = new Uri(files[0]);
            img.EndInit();
            imgOrignal.Source = img;
            this.txtChoicePath.Text = files[0];
            if (!flyoutAppSettings.IsOpen)
            {
                flyoutAppSettings.IsOpen = true;
            }
        }
        else
        {
            this.ShowMessageAsync("提示", "請拖入圖片格式的文件!", MessageDialogStyle.Affirmative, new MetroDialogSettings() { AffirmativeButtonText = "肯定" });
        }
    }
}

這樣簡單的設置就能實現桌面與窗體之間文件的交互。

四、圖片的縮放與移動

  在作圖像處理時,支持圖片的縮放以及圖片的移動是最基本的功能,由於有些圖片特別大,可是桌面的顯示面積有限,這時圖片的縮放與移動就顯得很是的有用,好比放大圖片的某個部位,觀察調色的效果。

爲了實現圖片的縮放與移動,要爲<Image></Image>註冊四個事件,分別爲:

MouseLeftButtonUp="imgTarget_MouseLeftButtonUp"
MouseLeftButtonDown="imgTarget_MouseLeftButtonDown"
MouseMove="imgTarget_MouseMove"
MouseWheel="imgTarget_MouseWheel"

實現這四個事件的代碼:

private void imgOriginal_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    imgOrignal.ReleaseMouseCapture();
}

private void imgOriginal_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (!imgOrignal.IsMouseCaptured)
    {
        imgOrignal.CaptureMouse();
        Original_start = e.GetPosition(borderOrignal);
        Original_origin.X = imgOrignal.RenderTransform.Value.OffsetX;
        Original_origin.Y = imgOrignal.RenderTransform.Value.OffsetY;
    }
}

private void imgOriginal_MouseMove(object sender, MouseEventArgs e)
{
    if (imgOrignal.IsMouseCaptured)
    {
        System.Windows.Point p = e.MouseDevice.GetPosition(borderOrignal);
        Matrix m = imgOrignal.RenderTransform.Value;
        m.OffsetX = Original_origin.X + (p.X - Original_start.X);
        m.OffsetY = Original_origin.Y + (p.Y - Original_start.Y);
        imgOrignal.RenderTransform = new MatrixTransform(m);
    }
}

private void imgOriginal_MouseWheel(object sender, MouseWheelEventArgs e)
{
    System.Windows.Point p = e.MouseDevice.GetPosition(imgOrignal);
    Matrix m = imgOrignal.RenderTransform.Value;
    if (e.Delta > 0)
    {
        m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
    }
    else
    {
        m.ScaleAtPrepend(1 / 1.1, 1 / 1.1, p.X, p.Y);
    }
    imgOrignal.RenderTransform = new MatrixTransform(m);
}

簡單明瞭的幾行代碼就實現了圖片的縮放與拖拽,是否是感受.NET平臺很強大啊?

這篇主要寫了一些圖片色彩糾正的一些外圍技術,圖片色彩糾正這方面的知識點尚未涉及到,下篇即將重點介紹。

支持本博客的朋友,大力點擊右下角的推薦。

 源碼獲取規則,見此博客文尾。

相關文章
相關標籤/搜索