WPF(C#)图片色彩的纠正-上

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平台很强大啊?

这篇主要写了一些图片色彩纠正的一些外围技术,图片色彩纠正这方面的知识点还没有涉及到,下篇即将重点介绍。

支持本博客的朋友,大力点击右下角的推荐。

源码获取规则,见此博客文尾。

时间: 2024-10-11 22:22:36

WPF(C#)图片色彩的纠正-上的相关文章

WPF 无缝图片滚动

上图是效果  可以双方向拖动 废话不多说上代码 界面: 1 <Window x:Class="FlashPrac2.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="MainWindow&qu

内容和图片在从网络上获取到之后都会存入到本地缓存中

内容和图片在从网络上获取到之后都会存入到本地缓存中,因此即使手机在没有网络的情况下依然能够加载出以前浏览过的新闻.而使用的缓存技术不用多说,自然是DiskLruCache了,那么首先第一个问题,这些数据都被缓存在了手机的什么位置呢? 其实DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,但是通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径.选择在这个位置有两点好处:第一,

WPF显示图片

1.WPF显示图片内部一部分 <Rectangle Height="12" Width="60"> <Rectangle.Fill > <ImageBrush ImageSource="Pic\icon_tubiao1.png" ViewboxUnits="Absolute" Viewbox="448,407,60,12"></ImageBrush> <

调取系统相机、并将图片展示在ImageView上

+ ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

适应各浏览器图片裁剪无刷新上传js插件(转)

看到一篇兼容性很强的图片无刷新裁剪上传的帖子,感觉很棒.分享下!~ 废话不多说,上效果图. 一.首先建立如下的一个page <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <

集合差集 哈希表 比较数据库中的图片和服务器上的图片,将服务器上的垃圾图片删除

SSH 框架下code: public String deleRubbishAd(){ int deleADcount = 0; rubbishADtp = configDao.rubbishADtp(); //数据库中的广告图片集合 Map<Object,Object> shujuku= new HashMap<Object,Object>(); File adfile = new File("C://Program Files//Apache Software Fou

WPF中利用WebClient向服务器上传文件

转载:原文地址http://blog.csdn.net/wj1589300/article/details/9255631 WPF中利用WebClient向服务器上传文件 忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题.先说一下我的探索步骤吧~ 一.选用WebClient.UploadFile方法 (String,String, String) [csharp] view plaincopyp

在ASP.NET中实现图片、视频文件上传方式

一.图片 1.在前端用<asp:FileUpload ID="UpImgName" runat="server"/>控件 2.在后台.cs中写上 protected void btnSubmit_Click(object sender,EventArgs e) { string strImgPath=string.Empty; string strDateTime=dateTime.Now.Tostring("yyyyMMddhhmmss&qu

【Android实战】----基于Retrofit实现多图片/文件、图文上传

一.再次膜拜下Retrofit Retrofit无论从性能还是使用方便性上都很屌!!!,本文不去介绍其运作原理(虽然很想搞明白),后面会出专题文章解析Retrofit的内部原理:本文只是从使用上解析Retrofit实现多图片/文件.图文上传的功能. 二.概念介绍 1)注解@Multipart 从字面上理解就是与多媒体文件相关的,没错,图片.文件等的上传都要用到该注解,其中每个部分需要使用@Part来注解..看其注释 /** * Denotes that the request body is m