【WPF】ImageMagick调节图片的颜色
需求:打开一张图片后,自由调节图片的颜色(色调)。
思路:读取显示一张图片后,用ColorPicker取色器选择一种颜色,之后将图片的色调调节为该颜色。
工具:
1、图像工具 ImageMagick(.Net版)http://www.imagemagick.org/script/develop.php#dot-net。或者在VS里Nuget搜Magick.NET-Q8-AnyCPU。
2、WPF的取色器插件 https://www.cyotek.com/blog/colorpicker-controls-for-windows-forms。或者在VS里Nuget搜Cyotek.Windows.Forms.ColorPicker。这是设计给Form用的,但是WPF中也能用代码调用来使用。
新建一个WPF项目,显示一张本地图片。注意图片是背景透明的,用该图表示一个图层。
<Window x:Class="TestMagickImage.Presentation.Views.ShellWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:TestMagickImage.Applications.ViewModels"
mc:Ignorable="d" Title="{Binding Title}" Icon="{StaticResource ApplicationIcon}" Width="380" Height="400"> <DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="_File">
<MenuItem Header="调色" Command="{Binding ShowPalletCommand}"/>
</MenuItem>
</Menu> <Grid>
<Image x:Name="img" Source="/TestMagickImage;component/Presentation/Resources/Images/test.png" />
</Grid>
</DockPanel>
</Window>
这里显示的是一张捕鱼游戏的小鱼图片素材。
在菜单项MenuItem中准备了一个按钮,按钮点击事件弹出取色器。取色器中拾取一种颜色后点击确定后,将图片调整到该色调。下面演示调整偏红色的情况。
private void ShowPallet()
{
// 创建取色器(调色板)控件
ColorPickerDialog colorPickerDialog = new ColorPickerDialog();
colorPickerDialog.Width = ;
colorPickerDialog.Height = ;
colorPickerDialog.ShowDialog(); // 查看刚才获取的颜色Color对象属性
//MessageBox.Show(colorPickerDialog.Color.ToString()); using (MagickImage image = new MagickImage(ConvertImageSourceToBitmap(shellWindow.img.Source)))
{
// byte --> float
float r = colorPickerDialog.Color.R; // 仅设置Red通道
image.Evaluate(Channels.Red, EvaluateOperator.Set, r); // 重新给Image控件赋值新图像
shellWindow.img.Source = image.ToBitmapSource();
}
} /// <summary>
/// ImageSource --> Bitmap
/// </summary>
/// <param name="imageSource"></param>
/// <returns></returns>
public Bitmap ConvertImageSourceToBitmap(ImageSource imageSource)
{
BitmapSource m = (BitmapSource)imageSource; System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(m.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); System.Drawing.Imaging.BitmapData data = bmp.LockBits(
new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); m.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); bmp.UnlockBits(data); return bmp;
}
调色后的效果,小鱼整体色调偏红色。因为上面的代码仅设置了图片的Red通道,所以无论颜色盘选中哪个位置,都只会取其R值使用,G值、B值未被使用上。
但是,如果同时开放调整RGB三个通道,就会把整个图片变成单一色块!把上面代码稍微改动一下。
using (MagickImage image = new MagickImage(ConvertImageSourceToBitmap(shellWindow.img.Source)))
{
// byte --> float
float r = colorPickerDialog.Color.R;
float g = colorPickerDialog.Color.G;
float b = colorPickerDialog.Color.B; // 设置三个通道
image.Evaluate(Channels.Red, EvaluateOperator.Set, r);
image.Evaluate(Channels.Green, EvaluateOperator.Set, g);
image.Evaluate(Channels.Blue, EvaluateOperator.Set, b); // 重新给Image控件赋值新图像
shellWindow.img.Source = image.ToBitmapSource();
}
运行后的效果是一整个色块。也许有人会碰到有这种需求的情况??
【WPF】ImageMagick调节图片的颜色的更多相关文章
- 【C#/WPF】调节图像的HSL(色相、饱和度、明亮度)
原文:[C#/WPF]调节图像的HSL(色相.饱和度.明亮度) 先说概念: HSL是一种描述颜色的方式(其他颜色描述方式还有大家熟悉的RGB值).HSL三个字母分别表示图像的Hue色相.Saturat ...
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明
php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切.压缩.合并.插入文本.背景色透明等.并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法 ...
- Atitit 动态按钮图片背景颜色与文字组合解决方案
Atitit 动态按钮图片背景颜色与文字组合解决方案 转换背景颜色,setFont("cywe_img", fontScale, 50, 5) 设置文字大小与坐标 文字分拆,使用字 ...
- unity, 调节图片导入尺寸
unity中直接导入高清图,通过max size来调节图片尺寸. 打包的时候通过看editor log或通过插件来监视是否有过大尺寸的图片.
- Android 图片的颜色处理
仿造美图秀秀移动鼠标调整seekbar,调整图片的颜色 项目布局如下: <LinearLayout xmlns:android="http://schemas.android.com/ ...
- 使用CSS3滤镜让图片反转颜色
CSS提供的滤镜也是一大亮点,我一直痴迷其中,有些滤镜的效果很有用,可是有些的滤镜效果可能只是为了玩玩儿,CSS常见的滤镜有这些:grayscale, blur, sepia,所有常见的过滤器.但是如 ...
- 改变图片的颜色,UIImage改变颜色
定义 #import <UIKit/UIKit.h> @interface UIImage (ChangeImageColor) /** * 改变图片的颜色 * * @param tint ...
- Android5.0新特性——图片和颜色(drawable)
图片和颜色 tint属性 tint属性一个颜色值,可以对图片做颜色渲染,我们可以给view的背景设置tint色值,给ImageView的图片设置tint色值,也可以给任意Drawable或者NineP ...
- php 获取图片主要颜色的方法
本文章向码农们介绍php 获取图片主要颜色的方法,主要涉及php针对图片的相关操作技巧,需要的码农可以参考一下. $i = imagecreatefromjpeg("image.jpg&qu ...
随机推荐
- 2017-9-14-Linux移植:加快Linux主机的启动速度
参考文章:http://www.mintos.org/skill/fast-boot.html 今天本来不打算写Blog了,Linux笔记本开机太慢了,浪费生命.何不干脆写一篇关于加快Linux主机启 ...
- 基于CC2530/CC2430 的温度采集系统--DS18B20
DS18B20是常用的温度传感器.CC2530 采集DS18B20 可以实现温度采集系统等等. 模块链接:https://item.taobao.com/item.htm?id=54130861732 ...
- WordPress UpdraftPlus插件 Google Drive 备份
本文连接地址: http://blog.tuzhuke.info/?p=168 本文作者:tuzhuke 完成时间:2015-04-10 使用wordpress 搭建自己的博客网站,但是对于租用的服务 ...
- Vue发送请求
可以试试玩ajax请求,个人觉得axios用Promise包装了下,代码美观 axios请求使用方法 https://github.com/axios/axios#using-applica ...
- BZOJ2948 : [Poi2001]绿色游戏
维护一个保护集合$S$,表示哪些点$A$可能胜利. 首先将所有绿点加入$S$. $1.$对于一个不在$S$的$A$点,若它存在某个后继在$S$中,则将其加入$S$. $2.$对于一个不在$S$的$B$ ...
- 最长公共子序列-LCS问题 (LCS与LIS在特殊条件下的转换) [洛谷1439]
题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出 一个数,即最长公共子序列的长度 输入样例 5 ...
- 3ds max学习笔记(三)--视点显示控制
显示模式:1.模型一般是以实体方式显示的,若想看线框方式,摁F3:返回实体,摁F3:2.实体加线框模式显示,摁F4:返回,摁F4:3.透明效果:ALT+X,透明显示,之后F4,显示线框:程序内的其他显 ...
- 前端利器Emmet
前端利器Emmet Emmet可以通过缩写生成代码片段,可以提升前端开发的效率.使用方法就是输入HTML或者CSS的缩写,然后按tab键自动生成.原文在这里 后代 > <!-- nav&g ...
- 三行代码辨别PS
三行代码辨别PS 博主的好友动态和朋友圈经常出现各种图片,博主很想知道这些图片有没有经过PS,于是选择了技术流-- 代码 先放代码为敬,返回结果为TRUE表示进行过PS. isPS.py #!/usr ...
- 改变下blog思维
自言自语 总是希望我写出来的东西都是精品或者尽我的努力使其接近精品,所以写一个就会消耗不少时间. 但是进来实在太忙,就没办法写:以至于断更了一大段时间.所以从现在开始记录一些很简小的东西直到我又开始有 ...