zoukankan      html  css  js  c++  java
  • WPF 图片灰度处理

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


    Xiao Yan Qiang
    Sheldon _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

    再次的谢谢他们…

  • 相关阅读:
    windows下操作linux虚拟机映射网络驱动器中文件提示chmod权限不足解决方案
    Centos 更改MySQL5.7数据库目录位置
    MySQL语句增加字段,修改字段名,修改类型,修改默认值
    [MySQL]MySQL数据库中如何查询分组后每组中的最后一条记录?
    ROW_NUMBER()函数使用详解
    【转】mysql 存储过程的示例
    简简单单储存过程——循环一个select结果集
    mysql存储过程demo
    mysql日期加一个天数获得新的日期
    使用SyncNavigator轻松实现数据库异地同步、断点续传、异构同步
  • 原文地址:https://www.cnblogs.com/wangshuai/p/2285034.html
Copyright © 2011-2022 走看看