WPF 图片灰度处理

WPF: 实现 disabled 时自动变灰的 Image 用过 WinForms 的人都知道,如果一个 Button 或者 MenuItem 里包含了一个图片,那么当Button 或者MenuItem 被 disabled 时,包含的图片会自动变成灰色并且变淡。惊人的是,WPF 里并没有现成的这项功能;而且,摸索发现实现这个功能并不方便。以下就来归纳几种让Image 在 disabled 时自动变灰的解决方案。这里着重于图标的自动变灰效果。 方案一:采 阅读详情

文章的内容是来自微软中文技术论坛的一个帖子,当时是想将一段将图片灰度处理的代码转换为XAML的一个样式,在这里要谢谢


Xiao Yan Qiang
、Sheldon _Xiao、shixin 的热情回答,现在将他们的回答贴出来供大家学习参考.内容如下:

 

提问: 这个功能如何写成一个样式,将一个窗体内所有的Image控件的图片格式都转换为Gray8

BitmapImage bitmapImage = new BitmapImage(newUri("D:\\Face.jpg"));    

FormatConvertedBitmap newFormatedBitmapSource =new FormatConvertedBitmap();    
newFormatedBitmapSource.BeginInit();     
newFormatedBitmapSource.Source = bitmapImage;     
newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8;    
newFormatedBitmapSource.EndInit();     

img.Source = newFormatedBitmapSource;     
this.Content = img; 

 

Xiao Yan Qiang的回答:

 

public class ImageAttached
{
    // Gray8附加属性,Gary8图片样式的"开关"    public static readonly DependencyProperty Gray8Property =
        DependencyProperty.RegisterAttached("Gray8", typeof(bool), typeof(ImageAttached),
            new FrameworkPropertyMetadata((bool)false,
                new PropertyChangedCallback(OnGray8Changed)));

    public static bool GetGray8(DependencyObject d)
    {
        return (bool)d.GetValue(Gray8Property);
    }

    public static void SetGray8(DependencyObject d, bool value)
    {
        d.SetValue(Gray8Property, value);
    }

    private static void OnGray8Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Image currentImage = d as Image;
        if (currentImage == null)
        {
            return;
        }

        bool isGray8 = (bool)d.GetValue(Gray8Property);

        if (isGray8)
        {
            // 附加BitmapSourceBackup属性,备份当前BitmapSource,以备恢复用          
            BitmapSource backupBitmapSource = (currentImage.Source as BitmapSource).CloneCurrentValue();
            d.SetValue(BitmapSourceBackupProperty, backupBitmapSource);

            // 建立Gray8的BitmapSource            FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
            newFormatedBitmapSource.BeginInit();
            newFormatedBitmapSource.Source = currentImage.Source as BitmapSource;
            newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8;
            newFormatedBitmapSource.EndInit();

            // 替换ImageSource            
            currentImage.Source = newFormatedBitmapSource;
        }
        else
        {
            // 图像恢复操作            
            object obj = currentImage.GetValue(BitmapSourceBackupProperty);
            if (obj == null)
            {
                return;
            }

            BitmapSource bs = obj as BitmapSource;
            if (bs == null)
            {
                return;
            }

            currentImage.Source = bs;
        }
    }

    // 备份用源图像的附加属性,当Gray8变更时,自动附加    public static readonly DependencyProperty BitmapSourceBackupProperty =
        DependencyProperty.RegisterAttached("BitmapSourceBackup", typeof(BitmapSource), typeof(ImageAttached),
            new FrameworkPropertyMetadata(null));

    public static BitmapSource GetBitmapSourceBackup(DependencyObject d)
    {
        return (BitmapSource)d.GetValue(BitmapSourceBackupProperty);
    }

    public static void SetBitmapSourceBackup(DependencyObject d, BitmapSource value)
    {
        d.SetValue(BitmapSourceBackupProperty, value);
    }
}
 

 

然后XAML里添加 local:ImageAttached.Gray8="True" 
 
        <Image xmlns:local="clr-namespace:WpfImageGray8Sample" Source="/WpfImageGray8Sample;component/Images/44537119.jpg" local:ImageAttached.Gray8="True" />
 
这样就可以方便控制Gray8了。
 
 
 
Sheldon _Xiao的回答:
 
推荐了一个链接: http://www.rikware.com/post/Setting-FormatConvertedBitmap-Source-via-Binding.aspx
 
里面也是用转换器实现
 
 
 
 
 

shixin的回答:

<Window x:Class="MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:y="clr-namespace:WpfApplication1" Title="MainWindow"Height="350" Width="525">    
            <
Window.Resources>    
                <
y:GrayImagex:Key="GrayImage" />    
            </
Window.Resources>    
            <
Grid>    
                <
Image Source="{BindingRelativeSource={RelativeSourceSelf}, Path=Tag,Converter={StaticResourceGrayImage}}" Tag="C:\Test.jpg" />    
            </
Grid>    
        </
Window>    

 

xaml部分还可以写成这样

<Window.Resources>    
            <
y:GrayImagex:Key="GrayImage" />    
            <
Style TargetType="{x:TypeImage}">    
                <
Setter Property="Source"Value="{BindingRelativeSource={RelativeSourceSelf}, Path=Tag,Converter={StaticResourceGrayImage}}" />    
            </
Style>    
        </
Window.Resources>    
        <
Grid>    
            <
Image Tag="C:\Test.jpg" />    
        </
Grid>    

Public Class GrayImage
    Implements IValueConverter
    Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
        Try
            Dim newFormatedBitmapSource As New FormatConvertedBitmap
            newFormatedBitmapSource.BeginInit()
            newFormatedBitmapSource.Source = New BitmapImage(New Uri(value.ToString))
            newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8
            newFormatedBitmapSource.EndInit()
            Convert = newFormatedBitmapSource
        Catch
            Convert = Nothing
        End Try
    End Function
    Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
        ConvertBack = value
    End Function
End Class


 

 

再次的谢谢他们…

 

WPF之灰阶图像显示 XMAL部分:直接拖一个Image控件到窗口上 <Image Name="Image1" HorizontalAlignment="Left" Height="242" Width="192" VerticalAlignment="Top" /> ----------------------------------------------------------------------- 阅读详情

相关推荐

手把手教你打造CTF动态靶场

公司想搞一个CTF比赛,需要一个竞赛靶场,于是这个任务就落在了我的身上,平台是利用CTFd框架,基于docker搭建的动态靶场,搭建过程中遇到的坑比较多,这里我会把每一个遇到的坑都指出来。我搭建的是CTFd的3.X的版本。第一次搭建的话,搭建的过程会有些痛苦,但是搭建完成后会越来越熟练,这个平台的可用性还是很高的。由于搭建的过程中遇到的坑太多了,各种各样的问题,所以决定写下这篇文章,把所有的坑都指出来,也算为后边想搭这个平台的小伙伴指一条路。Taps:资源来源:星海安全实验室如果你也对网络安全&黑客。

Python栈 4935

WPF设置图片灰度显示与恢复彩色显示

这是一个比较常见的需求,研究了一下,找到设置图片灰度显示和恢复彩色显示的方法,接下来,将用一个case来描述这个实现过程:窗口包含一张彩色图片和两个按钮,点击一个按钮,图片显示灰白两色,点击另外一个按钮,图片显示彩色。 窗口代码: <Window x:Class="TestForWpf.Grayscale" xmlns="http://schemas.microsoft.com

攀升·Lislie 5362

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4579

WPF如何全局应用黑白主题效果

灰白色很多时候用于纪念,哀悼等。那么使用WPF如何来做到这种效果呢?要实现的这种效果,我们会发现,它其实不仅仅是要针对图片,而是要针对整个窗口来实现灰白色。如果只是针对图片的话,我可以可以对图片进行灰阶转换,即可达到灰色效果。上述方法也可以直接在xaml里面表示。如果我们想针对整个窗口应用这种灰色的效果,那我们可以用着色器特效()来实现。

qq_22933729的博客 968

跨越移植陷阱:ESP-IDF下LVGL与ILI9341的组件化集成与常见避坑指南

本文详细解析了在ESP-IDF环境下将LVGL图形库与ILI9341显示屏驱动进行组件化集成的完整流程。重点介绍了移植过程中的关键配置策略、内存管理优化技巧以及常见问题解决方案,帮助开发者有效规避内存溢出、显示异常等典型陷阱,实现高效稳定的嵌入式GUI开发。

yhn456789的博客 628

智能车数字图像处理算法入门及C语言实现

智能车图像的最最基本入门算法介绍及C语言实现,二值化 - 特征识别 - 补线 - 中心巡线 - 偏差曲率计算。

不想随波逐流的大学生一枚,我们每个人都在努力奔跑 5113

wpf 让透明图片变灰 wpf disable image

前台: 后台:ImageSource isource = myImg.Source; FormatConvertedBitmap fcb = new FormatConvertedBitmap((BitmapSource)isource, PixelFormats.Gray32Float

1874

DSPF28335:从零到一,实战GPIO与外部中断的嵌入式系统交互设计

本文以德州仪器DSPF28335芯片为例,详细讲解了嵌入式系统中GPIO与外部中断(EXTI)的实战配置方法。通过一个完整的按键控制LED并触发ADC采样的项目,深入剖析了GPIO寄存器配置、三级中断机制(外设-PIE-CPU)以及中断服务函数编写的核心要点,帮助开发者掌握嵌入式交互设计的基石,并提供了关键的避坑指南与调试清单。

weixin_29169899的博客 115

WPF 将图片进行灰度处理

WPF 将图片进行灰度处理 原文:WPF 将图片进行灰度处理处理前: 处理后: 这个功能使用使用了 FormatConvertedBitmap(为BitmapSource提供像素格式转换功能) 代码如下: public partial class MainWindow : Window { ...

weixin_30724853的博客 192

C# 调用高德地图关键词 API

今天我们要一起探索如何使用 C# 来调用高德地图的关键词搜索 API,从而实现精准的地理位置搜索功能。高德地图的关键词搜索 API 可以帮助我们轻松地实现这一点,它能够返回一系列匹配关键词的地点坐标和其他相关信息。通过简单的几行 C# 代码,我们就实现了调用高德地图关键词搜索 API 的功能。接下来,我们将在一个 C# 控制台应用中实现调用高德地图关键词搜索 API 的功能。此外,如果要在生产环境中使用,还需要考虑安全性问题,例如不要在客户端暴露 API 密钥。🔥关注墨瑾轩,带你探索编程的奥秘!

java专栏 1106

C#里用HttpListener实现WEB API接口服务端

本文介绍了一个基于WinForm的HTTP服务实现方案。该方案使用HttpListener类创建了一个支持JSON POST请求处理的轻量级Web服务器,主要特点包括:1) 纯线程方式实现请求监听和处理;2) 提供标准化的JSON响应格式;3) 支持自定义请求处理逻辑;4) 包含完整的日志记录功能。代码示例展示了如何初始化服务、处理不同类型的请求(包括JSON POST),并提供了线程安全的UI更新机制。该实现适用于需要简单HTTP接口的Windows桌面应用程序,可作为程序间通信的基础设施。

大坡3D软件开发 231

端侧YOLO还是云端Flash?一张决策表终结你的两难选择

在AIoT和嵌入式视觉领域,边缘算力与大模型API的协同正成为主流技术路径。端侧部署YOLO模型依赖AI视觉SoC的NPU算力,通过INT8量化、算子适配实现毫秒级实时检测,保障数据隐私;而云端Flash作为轻量化大模型服务,以自然语言理解能力处理开放性场景,但受网络和成本约束。理解两者原理后,可通过八维度决策表(实时性、网络依赖、隐私安全、成本等)量化打分,结合项目硬约束选择最优方案。实际工程中,端侧YOLO初筛加云端Flash精判的协同架构,能将检测精度与云端调用成本平衡到最佳状态。本文从部署流程、量化

weixin_34055787的博客 437

3、基于视觉的智能分拣机:原理、算法与应用

本文介绍了一种基于视觉的智能分拣系统,利用树莓派、相机模块和多种检测算法实现低成本、高精度的物体分拣。系统支持颜色、形状和尺寸三种检测方式,准确率达99%,广泛适用于制造业、农业和物流等领域。文章详细阐述了各检测算法原理、测试结果及系统优化方向,并探讨了其实际应用案例与未来发展前景。

mqtt6iot的博客 239

【转】【WPF】wpf 图片指针处理

我一直用GDI+做Winform 的基于指针的图片处理,这次下决心全部移到wpf上(主要是显示布局很方便)采用的图片是2512*3307 的大图 830万像素类库基于WritableBitmapEx 的wpf版本函数是我自己写的扩展方法,只是利用了 writableBitmapEx提供的环境 ,我懒得从头到尾自己写了1.标准int32数组遍历计算 release0.28s public u...

weixin_30613433的博客 88

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

图片灰度处理

一、WPF灰度处理(转) 文章的内容是来自微软中文技术论坛的一个帖子,当时是想将一段将图片灰度处理的代码转换为XAML的一个样式,在这里要谢谢 Xiao Yan Qiang、Sheldon _Xiao、shixin的热情回答,现在将他们的回答贴出来供大家学习参考.内容如下: 提问: 这个功能如何写成一个样式,将一个窗体内所有的Image控件的图片格式都转换为Gray8 BitmapImage bi...

weixin_34318272的博客 173

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WPF下的简单数字图像处理

BitmapSource 是WPF中图片的核心类型,读、写、显示都很常用,下面所有的操作都是以这个类型为核心的。 从文件读如图片到BitmapSource 类型: 1 private BitmapSource GetSource() 2 { 3   BitmapSource result = null; 4 5   OpenFileDialog dialog = new Open...

weixin_30649859的博客 210

图片变灰

处理后:  原先: 代码: BitmapImage bitmapImage = new BitmapImage(new Uri(Directory.GetCurrentDirectory() + @"\奥克拉荷马生物医药园.png")); newFormatedBitmapSource = new FormatConvertedBitm

dark00800的专栏 690

halcon联合c#、WPF学习笔记二(简单案例)

halcon联合c#、WPF学习笔记二一、Halcon导出c#代码二、新建WPF工程并编辑界面三、采集图片按钮四、显示图片五、处理图片六、完整代码 一、Halcon导出c#代码 首先在halcon内部完成代码编码,并导出成c# 在halcon中将下面代码复制到代码编辑界面 read_image (Image, ''C:/Users/xhd/Desktop/image/5.png') dev_open_window (0, 0, 512, 512, 'black', WindowHandle) rgb1_to

菊头蝙蝠的博客 4353
上一篇: (转) 给软件添加注册码
下一篇: (转)如何防止代码腐烂
似静水流深
博客等级 码龄15年 5粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值