文章出處

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

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

前言

  對圖片進行色彩的糾正,其實與WPF是沒有什么關系的,為什么標題又是“WPF(C#)圖片色彩的糾正”呢,因為這些圖片色彩的糾正功能都是承載在WPF界面上的,并且我也很想介紹一些關于WPF方面的知識,所以就命名了此標題。

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

圖一:開始界面

圖二:設置界面

圖三:全景界面

 技術點描述

色彩糾正方面的內容涉及到較多的數學公式,在后面的博客中將作深入描述,此篇主要描述如下幾個技術點:

1、系統兼容性(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批量插入時,記得一定要加上顯示事務,如果不加上顯示事務,是插入一條提交一條,加上了顯示事務,是所有的都插入完成后,再提交事務,顯而易見,后一種方法較前一種方法快。

2、把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的數據源。

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

  現在很多軟件都有桌面與窗體之間的文件拖拽功能,比如百度云就支持此功能,在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 = "確定" });
        }
    }
}

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

4、圖片的縮放與移動

  在做圖像處理時,支持圖片的縮放以及圖片的移動是最基本的功能,因為有些圖片特別大,但是桌面的顯示面積有限,這時圖片的縮放與移動就顯得非常的有用,比如放大圖片的某個部位,觀察調色的效果。

為了實現圖片的縮放與移動,要為<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平臺很強大啊?

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

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

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


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()