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