原文:WPF 图片灰度处理

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

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

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

BitmapImage bitmapImage = new BitmapImage(new Uri("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:GrayImage x:Key="GrayImage" />

            </Window.Resources>

            <Grid>

                <Image Source="{Binding RelativeSource={RelativeSource Self}, Path=Tag, Converter={StaticResource GrayImage}}" Tag="C:\Test.jpg" />

            </Grid>

        </Window>

xaml部分还可以写成这样

<Window.Resources>

            <y:GrayImage x:Key="GrayImage" />

            <Style TargetType="{x:Type Image}">

                <Setter Property="Source" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag, Converter={StaticResource GrayImage}}" />

            </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 图片灰度处理的更多相关文章

  1. 制作一个简单的WPF图片浏览器

    原文:制作一个简单的WPF图片浏览器 注:本例选自MSDN样例,并略有改动.先看效果: 这里实现了以下几个功能:1.  对指定文件夹下所有JPG文件进行预览2.  对选定图片进行旋转3.  对选定图片 ...

  2. Atitit 图像处理 灰度图片 灰度化的原理与实现

    Atitit 图像处理 灰度图片 灰度化的原理与实现 24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图 ...

  3. CSS 实现图片灰度效果 兼容各种浏览器

    CSS 实现图片灰度效果 兼容各种浏览器如360浏览器 CSS实现图片灰度效果就是通过CSS样式让彩色图片呈现为灰色,相当于把一张图像的颜色模式调整为灰度,CSS可以通过以下几种方法来实现灰度效果. ...

  4. WPF 图片浏览 伪3D效果

    原文:WPF 图片浏览 伪3D效果 首先上效果图: 因项目要求,需要把图片以"好看"."炫"的效果展示出来,特地研究了一下WPF关于3D方面的制作,奈何最终成果 ...

  5. CSS 实现图片灰度效果

    非原创-从网上收索出来的文章 CSS实现图片灰度效果就是通过CSS样式让彩色图片呈现为灰色,相当于把一张图像的颜色模式调整为灰度,CSS可以通过以下几种方法来实现灰度效果. 方式1. IE滤镜 img ...

  6. WPF 图片抗锯齿,尤其是小图片更为严重

    WPF 图片抗锯齿,尤其是小图片更为严重 UseLayoutRounding="True" 搞定,就是这么给力,分享给大家

  7. WPF图片预览之移动、旋转、缩放

    原文:WPF图片预览之移动.旋转.缩放 RT,这个功能比较常见,但凡涉及到图片预览的都跑不了,在说自己的实现方式前,介绍一个好用的控件:Extended.Toolkit中的Zoombox,感兴趣的同学 ...

  8. 【转】解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)

    解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight) 转载自:http://www.360doc.com/content/13/1126/09/10504424_332211 ...

  9. WPF图片浏览器(显示大图、小图等)

    原文:WPF图片浏览器(显示大图.小图等) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshubo1989/article/details ...

随机推荐

  1. C语言编程程序的内存怎样布局

    在c语言中,每一个变量和函数有两个属性:数据类型和数据的存储类别. C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1. 从变量的作用域划分变量(即 ...

  2. thinkphp3.2二维码扩展

    //简易二维码 public function qrcode(){ Vendor('phpqrcode.phpqrcode'); //生成二维码图片 $object = new \QRcode(); ...

  3. oracle 让人抓狂的错误之 null值 与 无值(无结果)-开发系列(一)

    近期.在做开发.写存过的时候碰到一些问题,找了好长时间才发现原因.并且是曾经不知道的. 所以在这给记下来 给自己备忘和大家參考. 一 .null值 以下举个最简单的样例.寻常工作其中肯定比这个sql复 ...

  4. 【Lucene4.8教程之三】搜索 2014-06-21 09:53 1532人阅读 评论(0) 收藏

    1.关键类 Lucene的搜索过程中涉及的主要类有以下几个: (1)IndexSearcher:执行search()方法的类 (2)IndexReader:对索引文件进行读操作,并为IndexSear ...

  5. c#List泛型数据扩展,把List&lt;&gt;型数据格式化成List&lt;SelectListItem&gt;,用来作dropdownlist的数据

    代码例如以下 public static List<SelectListItem> CreateSelect<T>(this IList<T> t, string ...

  6. java pns

    http://autumnrain-zgq.iteye.com/blog/1743279 http://blog.csdn.net/a351945755/article/details/2218939 ...

  7. C++ 快速入门笔记:进阶编程

    C++入门笔记:高级编程 文件和流 打开文件 void open (const char *filename, ios::openmode mode); ios::app 追加模式.所有写入都追加到文 ...

  8. Qt Roadmap for 2018(对3D有很多改进)

    When it comes to new features, we have many things ongoing related to graphics, so I’ll start with t ...

  9. WPF实现射线效果动画

    原文:WPF实现射线效果动画 最近的一个项目中有个需求是:从一个点向其它多个点发出射线,要求这些射线同时发出,同时到达. 我就想到了用WPF的动画来实现.WPF中有Line类用于绘制直线,但这个类中好 ...

  10. zookeeper 半数可用/选举机制

    1.半数可用机制,半数可用指的是zk集群中一半以上的机器正常时集群才能正常工作 已经启动了hadoop002(follower),hadoop003(leader) 下面停止hadoop002 在ha ...