标签:des style blog http io color ar os 使用
一、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的BitmapSourceFormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
newFormatedBitmapSource.BeginInit();
newFormatedBitmapSource.Source = currentImage.Source as BitmapSource;
newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray8;
newFormatedBitmapSource.EndInit();
// 替换ImageSourcecurrentImage.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二、Windos8和WindowsPhone通过更改像素点颜色更改图片灰度
private async void Button_Click(object sender, RoutedEventArgs e) { // 实例化一个 300*300 的 WriteableBitmap,并将其作为 Image 控件的图片源 WriteableBitmap writeableBitmap = new WriteableBitmap(300, 300); image2.Source = writeableBitmap; StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/2.jpg")); using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read)) { // 将指定的图片转换成 BitmapDecoder 对象 BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream); // 通过 BitmapTransform 缩放图片的尺寸 BitmapTransform transform = new BitmapTransform() { ScaledWidth = Convert.ToUInt32(writeableBitmap.PixelWidth), ScaledHeight = Convert.ToUInt32(writeableBitmap.PixelHeight) }; // 获取图片的 PixelDataProvider 对象 PixelDataProvider pixelData = await decoder.GetPixelDataAsync( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, transform, ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage); // 获取图片的像素数据,由于之前指定的格式是 BitmapPixelFormat.Bgra8,所以每一个像素由 4 个字节组成,分别是 bgra byte[] sourcePixels = pixelData.DetachPixelData(); for (int i = 0; i < sourcePixels.Length; i+=4) { byte B = sourcePixels[i]; byte G = sourcePixels[i + 1]; byte R = sourcePixels[i + 2]; byte A = sourcePixels[i + 3]; byte GrayValue = (byte)(R * 0.299 + G * 0.587 + B * 0.114); sourcePixels[i]=GrayValue; sourcePixels[i + 1]=GrayValue; sourcePixels[i + 2]=GrayValue; sourcePixels[i + 3]=0xFF; } // 将修改后的像素数据写入 WriteableBitmap 对象的像素缓冲区(WriteableBitmap 使用的是 BGRA 格式) using (Stream stream = writeableBitmap.PixelBuffer.AsStream()) // IBuffer.AsStream() 为来自 System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions 中的扩展方法 { await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length); } } // 用像素缓冲区的数据绘制图片 writeableBitmap.Invalidate(); }
标签:des style blog http io color ar os 使用
原文地址:http://www.cnblogs.com/fuchongjundream/p/4089479.html