WPF中的图像处理简介

摘要:
与Winform中的GDI+相比,WPF提供了一组用于显示和编辑图像的新API。托管组件还可以从Windows Presentation Foundation图像处理编解码器扩展性模型中受益,该模型支持自动识别WPF中的新图像格式。大多数托管WPF图像处理API驻留在System.Windows.Media中。映像命名空间。但是,有几个重要类型驻留在System.Windows中。Media命名空间和Image驻留在System.Windows中。控制命名空间。此示例还显示了WPF图像处理的基本方式:从解码器获取图像信息并创建解码器后,图像信息保存在Frames属性中。

和Winform中的GDI+相比,WPF提供了一组新的API用于显示和编辑图像。新API特点如下:

  1. 适用于新的或专用图像格式的扩展性模型。
  2. 对包括位图 (BMP)、联合图像专家组 (JPEG)、可移植网络图形 (PNG)、标记图像文件格式 (TIFF)、Microsoft Windows Media 照片、图形交换格式 (GIF) 和图标 (.ico) 在内的本机图像格式增强了性能和安全性。
  3. 高位深图像数据的保留最多 32 位/通道。
  4. 非破坏性图像缩放、裁切和旋转。
  5. 简化的颜色管理
  6. 支持文件内的专用元数据。
  7. 托管组件利用非托管基础结构提供图像与其他 WPF 功能(如用户界面 (UI)、动画和图形)的无缝集成。托管组件还可以从 Windows Presentation Foundation (WPF) 图像处理编解码器扩展性模型获益,利用该模型可以实现自动识别 WPF 中的新图像格式。

大部分托管的 WPF 图像处理 API 驻留在 System.Windows.Media.Imaging 命名空间中,不过,几个重要的类型(如 ImageBrush 和 ImageDrawing)都驻留在 System.Windows.Media 命名空间,Image 驻留在 System.Windows.Controls 命名空间。

下面我通过一个简单的示例演示一下新的API的使用方法:

图像编码格式转换:

var imageStreamSource = File.OpenRead(@"r:\1\24.bmp"); 
var decoder = BitmapDecoder.Create(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
var bitmapFrame = decoder.Frames[0];

//在界面上显示图片 
//image1.Source = bitmapFrame;

var encoder = new JpegBitmapEncoder(); 
encoder.Frames.Add(bitmapFrame); 
encoder.Save(File.Create(@"r:\1\3.jpg"));

这个功能非常简单,就是把一个bmp格式的图片转换为了一个jpg格式的图片。这个示例也显示了WPF的图像处理的基本方式:

  1. 从解码器(xxxDecoder)中获取图像信息 
    创建解码器后,图像信息就保存在Frames(虽然大部分图像(jpg,bmp,png等)只有一帧,但GIF,ico等图像有多帧)属性中了。
  2. 用编码器(xxxEncoder)保持图像信息 
    相应的,编码时只要创建编码器,并设置相应的帧即可。

图像处理:

常用的图像处理包括缩放、裁切和旋转等,如下是一个将图像旋转90度的例子。

var imageStreamSource = File.OpenRead(@"r:\1\24.bmp"); 
var decoder = BitmapDecoder.Create(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
var bitmapFrame = decoder.Frames[0]; 
 

TransformedBitmap myRotatedBitmapSource = new TransformedBitmap(); 
myRotatedBitmapSource.BeginInit(); 
myRotatedBitmapSource.Source = bitmapFrame; 
 

// 旋转90 
myRotatedBitmapSource.Transform = new RotateTransform(90); 
myRotatedBitmapSource.EndInit(); 

//旋转

var rotate = new RotateTransform(90);
var rotatedBitMap = new TransformedBitmap(bitmapFrame, rotate);

image1.Source = rotatedBitMap;

////裁剪
//CroppedBitmap chainedBitMap = new CroppedBitmap(bitmapFrame,new Int32Rect(100, 0, (int)bitmapFrame.Width - 100, (int)bitmapFrame.Height));

////缩放
//var scare = new ScaleTransform(1.5, 2);
//var scaredBitMap = new TransformedBitmap(bitmapFrame, scare);

var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rotatedBitMap));
//encoder.Frames.Add(BitmapFrame.Create(scaredBitMap));
//encoder.Frames.Add(BitmapFrame.Create(chainedBitMap));
encoder.Save(File.Create(@"r:\1\3.jpg"));

和上面的例子相比,这里就是多了一个TransformedBitmap变换,其实这和xaml中的变换时一样的。

<Image Width="150" Margin="5" Grid.Column="0" Grid.Row="1"> 
  <
Image.Source
    <
TransformedBitmap Source="/sampleImages/watermelon.jpg" > 
      <
TransformedBitmap.Transform
        <
RotateTransform Angle="90"/> 
      </
TransformedBitmap.Transform
    </
TransformedBitmap
  </
Image.Source
</
Image>

其它变换也都可以参照xaml中处理方式进行,这里就不过多介绍了。

免责声明:文章转载自《WPF中的图像处理简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue中的代理Proxy和$refwin7怎样开启loopback接口(环回网卡)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!

昨天在mvvm wpf的开发中遇到一个问题,绑定不起作用,编辑阶段没问题也没有提示找不到对应的绑定,但是在运行之后却不起作用,查了很多资料,说法不一,有些是要删除datagrid的一行,直接绑定delete即可,但是我要绑定的是viewmodel的command,最终解决问题了,特分享如下(已解决): view: <DataGrid ItemsSou...

WPF读写config配置文件

WPF读写config配置文件单。 1. 在你的工程中,添加app.config文件。文件的内容默认为: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 </configuration> 2.如果你想给程序配置一些参数,就在<c...

wpf研究之道——datagrid控件数据绑定

前台: <DataGrid x:Name="TestCaseDataGrid" ItemsSource="{Binding}" > {binding} 是个简写的方式,绑定的是datagrid 对象的DataContext 后台: this.TestCaseDataGrid.DataContext = Data.PagerSource;...

Wpf 自定义控件(1)

1. 新建一个wpf工程,在工程下面新建  一个文件夹themes,在themes下新建两个资源字典文件generic.xaml和PrettySeekBar.xaml generic.xaml   <ResourceDictionary xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/pr...

[转]常见医疗扫描图像处理步骤

一 数据格式 1.1 dicom DICOM是医学图像中标准文件,这些文件包含了诸多的元数据信息(比如像素尺寸,每个维度的一像素代表真实世界里的长度)。此处以kaggle Data Science Bowl 数据集为例。 data-science-bowl-2017。数据列表如下: 后缀为 .dcm。 每个病人的一次扫描CT(scan)可能有几十到一百多...

WPF 下两种图片合成或加水印的方式

最近项目中应用多次应用了图片合成,为了今后方便特此记下。 在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名空间是System.Drawing 和 System.Drawing.Imaging,另一种是WPF中新添加的API,命名空间是 System.Windows.Media 和 System.Windows.Media.Imag...