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平臺很強大啊?
這篇主要寫了一些圖片色彩糾正的一些外圍技術,圖片色彩糾正這方面的知識點尚未涉及到,下篇即將重點介紹。
支持本博客的朋友,大力點擊右下角的推薦。
源碼獲取規則,見此博客文尾。