WPF Adorner 简易图片取色器
回答MSDN问题所写。
使用Adorner+附加属性

图片类(来自这位博主的博客)
/// <summary>
/// 用于获取位图像素的类
/// </summary>
public class Imghelper
{
/// <summary>
/// 位图宽度
/// </summary>
public int Width { get; protected set; }
/// <summary>
/// 位图高度
/// </summary>
public int Height { get; protected set; }
/// <summary>
/// 像素
/// </summary>
public Color[][] Pixels { get; protected set; } /// <summary>
/// 根据指定的位图生成BitmapPixelHelper类的新实例。
/// </summary>
/// <param name="bitmap">指定的位图</param>
public Imghelper(BitmapSource bitmap)
{
FormatConvertedBitmap newBitmap = new FormatConvertedBitmap(bitmap, PixelFormats.Bgra32, BitmapPalettes.WebPaletteTransparent, );
const int bytesPerPixel = ;
Height = newBitmap.PixelHeight;
Width = newBitmap.PixelWidth;
byte[] data = new byte[Height * Width * bytesPerPixel];
newBitmap.CopyPixels(data, Width * bytesPerPixel, ); Pixels = new Color[Height][];
for (int i = ; i < Height; ++i)
{
Pixels[i] = new Color[Width];
for (int j = ; j < Width; ++j)
{
Pixels[i][j] = Color.FromArgb(
data[(i * Width + j) * bytesPerPixel + ],
data[(i * Width + j) * bytesPerPixel + ],
data[(i * Width + j) * bytesPerPixel + ],
data[(i * Width + j) * bytesPerPixel + ]);
}
}
} /// <summary>
/// 获取图片的平均色
/// </summary>
public Color GetAverageColor()
{
int a = , r = , g = , b = ;
for (int i = ; i < Height; ++i)
{
for (int j = ; j < Width; ++j)
{
a += Pixels[i][j].A;
r += Pixels[i][j].R;
g += Pixels[i][j].G;
b += Pixels[i][j].B;
}
}
a = a / Height / Width;
r = r / Height / Width;
g = g / Height / Width;
b = b / Height / Width;
return Color.FromArgb((byte)a, (byte)r, (byte)g, (byte)b);
}
}
adorner代码
public class ShowImagePixelsPopup : Adorner
{ private TextBlock GetTextBlock;
private VisualCollection collection;
private UIElement _UIElement;
private Border GetBorder; public ShowImagePixelsPopup(UIElement adornedElement) : base(adornedElement)
{
collection = new VisualCollection(this); GetTextBlock = new TextBlock(); GetTextBlock.Height = ;
GetTextBlock.Width = ;
GetTextBlock.Background = new SolidColorBrush(Colors.Wheat);
GetTextBlock.HorizontalAlignment = HorizontalAlignment.Left;
GetTextBlock.VerticalAlignment = VerticalAlignment.Top;
GetBorder = new Border();
GetBorder.Height = ;
GetBorder.Width = ;
GetBorder.HorizontalAlignment = HorizontalAlignment.Left;
GetBorder.VerticalAlignment = VerticalAlignment.Top;
collection.Add(GetTextBlock);
collection.Add(GetBorder);
_UIElement = adornedElement;
}
protected override int VisualChildrenCount => collection.Count; protected override Visual GetVisualChild(int index) => collection[index]; protected override Size MeasureOverride(Size constraint) => base.MeasureOverride(constraint); public void SetData(Point MousePoint, String Pixels,Color color)
{
GetTextBlock.Margin = new Thickness(MousePoint.X+7.5, MousePoint.Y-, ,);
GetBorder.Margin = new Thickness(MousePoint.X-7.5 , MousePoint.Y-7.5 , , );
GetBorder.Background = new SolidColorBrush(color);
GetTextBlock.Text = Pixels;
} protected override Size ArrangeOverride(Size finalSize)
{
GetTextBlock.Arrange(new Rect(finalSize));
GetBorder.Arrange(new Rect(finalSize));
return base.ArrangeOverride(finalSize); }
}
附加属性类
public class IsShowImagePixels
{
public static readonly DependencyProperty IsShowImagePixelsProperty = DependencyProperty.RegisterAttached("IsShowImagePixels", typeof(bool), typeof(IsShowImagePixels), new PropertyMetadata(false, new PropertyChangedCallback(OnIsShowImagePixelsChanged))); public static void SetIsShowImagePixels(DependencyObject d, bool value) => d.SetValue(IsShowImagePixelsProperty, value); public static bool GetIsShowImagePixels(DependencyObject d) => (bool)d.GetValue(IsShowImagePixelsProperty); public static readonly DependencyProperty ShowImagePixelsPointProperty = DependencyProperty.RegisterAttached("ShowImagePixelsPoint", typeof(Point), typeof(IsShowImagePixels), new PropertyMetadata(new Point(, ),new PropertyChangedCallback(OnShowImagePixelsPointChanged))); public static void SetIsShowImagePixelsPoint(DependencyObject d, Point value) => d.SetValue(ShowImagePixelsPointProperty, value); public static Point GetShowImagePixelsPoint(DependencyObject d) => (Point)d.GetValue(ShowImagePixelsPointProperty); private static void OnShowImagePixelsPointChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var c =(Point)e.NewValue; popup.SetData(c, $"X={(((int)c.X ) < 0 ? 0 : (int)c.X )},Y={(((int)c.Y ) < 0 ? 0 : (int)c.Y )}", imghelper.Pixels[((int)c.Y - ) < ? : (int)c.Y - ][((int)c.X - ) < ? : (int)c.X - ]); }
private static AdornerLayer layer;
private static Imghelper imghelper;
private static ShowImagePixelsPopup popup; private static void OnIsShowImagePixelsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{ var NewValue = (bool)e.NewValue;
UIElement element = d as UIElement;
if (!NewValue)
{ AdornerLayer l = AdornerLayer.GetAdornerLayer(element);
var ado = l.GetAdorners(element);
for (var o = ; o < ado.Length; o++)
l.Remove(ado[o]);
element.MouseMove -= Element_MouseMove; imghelper = null;
popup = null;
layer = null;
element = null;
}
if (element == null)
return;
layer = AdornerLayer.GetAdornerLayer(element);
popup = new ShowImagePixelsPopup(element);
layer.Add(popup);
imghelper = new Imghelper((element as Image).Source as BitmapSource);
//显示鼠标位置
element.MouseMove += Element_MouseMove;
} private static void Element_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{ var c = e.GetPosition(sender as FrameworkElement);
//此处只是用了鼠标位置,也可以用ShowImagePixelsPoint直接指定位置
popup.SetData(c, $"X={(((int)c.X - 1) < 0 ? 0 : (int)c.X - 1)},Y={(((int)c.Y - 1) < 0 ? 0 : (int)c.Y - 1)}", imghelper.Pixels[((int)c.Y - ) < ? : (int)c.Y - ][((int)c.X - ) < ? : (int)c.X - ]); }
}
xaml代码
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<AdornerDecorator Grid.Row="">
<Image x:Name="img" />
</AdornerDecorator>
<Button Click="Button_Click" Grid.Row="" Height="" Content="ShowOrNot"/>
</Grid>
cs页面代码
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var b = new BitmapImage(new Uri("timg.jpg", UriKind.RelativeOrAbsolute));
Imghelper imghelper = new Imghelper(b);
img.Source = b;
img.SetValue(IsShowImagePixels.IsShowImagePixelsProperty, true);
Set = true;
}
private bool Set = false;
private void Button_Click(object sender, RoutedEventArgs e)
{ if (Set)
Set = false;
else
Set = true;
img.SetValue(IsShowImagePixels.IsShowImagePixelsProperty, Set);
return; }
}
WPF Adorner 简易图片取色器的更多相关文章
- wpf 仿QQ图片查看器
参考博客 WPF下的仿QQ图片查看器 wpf图片查看器,支持鼠标滚动缩放拖拽 实现效果 主要参考的WPF下的仿QQ图片查看器,原博主只给出了部分代码. 没有完成的部分 1.右下角缩略图是原图不是缩略图 ...
- Qt 简易图片播放器
一.前言 使用 Qt 制作了一个简单的图片播放器,点击 "浏览按钮" 浏览图片所在目录,目录中的所有图片缩小图标和名称会显示在左侧的图片列表中,点击列表中的图片项,可以在右侧区域的 ...
- 简易音乐播放器主界面设计 - .NET CORE(C#) WPF开发
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 简易音乐播放器主界面设计 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...
- wpf图片查看器,支持鼠标滚动缩放拖拽
最近项目需要,要用到一个图片查看器,类似于windows自带的图片查看器那样,鼠标滚动可以缩放,可以拖拽图片,于是就写了这个简单的图片查看器. 前台代码: <Window x:Class=&qu ...
- WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现
原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...
- powerpoint取色器有什么用|ppt取色器使用教程
在使用powerpoint过程中常常发现一些功能我们很少用到,其实是自己不会用的原因,关于powerpoint取色器有什么用呢?接下来我们一起来学一下ppt取色器使用教程. powerpoint取色器 ...
- TakeColor 屏幕取色器 8.0 中文绿色版
软件名称: TakeColor 屏幕取色器软件语言: 简体中文授权方式: 免费软件运行环境: Win8 / Win7 / Vista / WinXP软件大小: 210KB图片预览: 软件简介:使用方便 ...
- Arava: 用 swing 写一个取色器
备哥以前发我了一个小工具,TakeColor 取色器.来复刻一个吧. 分析一下:顶部是菜单,左侧框显示当前鼠标所在的颜色(下面显示当前坐标和颜色值,默认RGB),中间框显示鼠标周围区域,右侧显示取色的 ...
- wpf下的图片放大缩小
WPF下实现图片的放大缩小移动 在windows 7里面有自带的图片查看器,这个软件可以打开一张图片然后以鼠标在图片中的焦点为原点来进行缩放,并且放大后可以随意拖动.下面我们在WPF中实现这个功能 ...
随机推荐
- 数据库——SQL-SERVER CREATE-TABLES
给出数据库实验所需要的“CREATE-TABLES.SQL”文件 use master go if exists (select * from dbo.sysdatabases where name ...
- U8 BOM数据结构
U8 BOM涉及的数据表有四张 bom_bom BOM资料 该表主要记录BOM表的一些基本信息,版本.创建.审核等信息,不包括任何子件.母件信息:bomid是BOM主键 bom_parent ...
- Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之七 || API项目整体搭建 6.2 轻量级ORM
本文梯子 本文3.0版本文章 前言 零.今天完成的蓝色部分 0.创建实体模型与数据库 1.实体模型 2.创建数据库 一.在 IRepository 层设计接口 二.在 Repository 层实现相应 ...
- Java生鲜电商平台-订单中心服务架构与异常订单逻辑
Java生鲜电商平台-订单中心服务架构与异常订单逻辑 订单架构实战中阐述了订单系统的重要性,并从订单系统的信息架构和流程上对订单系统有了总体认知,同时还穿插着一些常见的订单业务规则和逻辑.上文写到订单 ...
- 尉蓝色的P2P金融众筹平台手机模板
蓝色的p2p金融投资众筹网手机模板html整站下载.实用的众筹app手机模板下载.主要页面有:众筹项目.发布.个人中心.登录.注册.优惠券.回报.项目详情.我要支持.帮助中心等总共37个手机页面. 模 ...
- Xcode模拟器无法启动解决办法
今天遇到模拟器无法启动问题,点击模拟器或者Xcode build模拟器就一直跳,跳一会就不跳了,然后查看模拟器状态,显示为无响应.或者黑屏,等半天不动. 如果你有类似情况可以尝试在终端执行以下命令: ...
- react-native 标题随页面滚动显示和隐藏
效果图如下: 代码实现: import React, {Component} from 'react'; import { ScrollView, Text, View, FlatList, } fr ...
- 9.JavaCC官方入门指南-例4
例4:计算器--添加减法运算 1. calculator1.jj 为了使得计算器具备更多功能,我们需要更多的操作符,比如减法.乘法和除法.接下来我们添加减法运算. 在词法分析器的描述部分,我们 ...
- bay——安装_RAC11g_LC_测试环境-rehat6+udev.txt
★★★____★☆★〓〓〓〓→VMware vSphere Client6.0 https://10.20.4.200/ 下载Vwmare IP:10.20.4.200-------账号:root-- ...
- [Linux] 纯净ubuntu快速搭建宝塔面板
宝塔官方建议是纯净的系统,我使用docker运行一个ubuntu容器,模拟一个纯净的系统,这样也不会影响到我的其他服务. docker run --name baota -id -p 8888:888 ...